- - PR -
タグ内容の更新とDTDについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2002-08-01 10:56
MSXML4+VC6で開発をしている者です。
問題が2つ発生しました。 1.タグ内容の更新 タグのデータを更新したいのですが 通常のデータなら問題ないのですが 特殊なデータ、具体的に言うと「 」をタグの内容に 更新したいのですがどうしても出来ません。 <tag1> </tag1> こんな感じで更新したいのです。 こういった「&」をDOMで書き込む事は出来ないのでしょうか? 2.DTDについて 以下のXMLがあるとして <root> <tag1/> <tag2/> <tag3/> <root> DTDでは <!ELEMENT root ( tag1, tag2, tag3 ) > と定義出来ますが tag1、tag2、tag3の出現が不規則 つまり <root> <tag1/> <tag3/> <tag2/> <root> でもOKとなるようなDTDは定義出来ないのでしょうか? 色々と調べたのですが、「&」で区切るとOKという情報が あったのですがMSXMLで読み込むとエラーになります <!ELEMENT root ( tag1 & tag2 & tag3 ) > 上記の場合、エラーとなる 質問の内容が2つバラバラですが 分かる方 いましたらご教授願います |
|
投稿日時: 2002-08-01 11:46
> 特殊なデータ、具体的に言うと「 」をタグの内容に更新したいのですがどうしても出来ません。
エスケープしてください。 < = < > = > & = & ' = ' " = " > <root> > <tag1/> > <tag2/> > <tag3/> > <root> 終わりが</root>でないですが・・・。 _________________ Paul K.Nakagome |
|
投稿日時: 2002-08-01 12:03
返答ありがとうございます
早速エスケープして<tag1>に書き込んで見たのですが 「&#160」というのをDOMで 書き込んで見たのですが結果は <tag1>&amp#160</tag1> となってしまいました。 具体的には _bstr_t bstrNodeData; VARIANT value; BSTR nodeData; bstrNodeData = "&#160"; nodeData = SysAllocString(bstrNodeData); value.vt = VT_BSTR; V_BSTR(&value) = nodeData; res = pNode->put_nodeValue(value); こんな感じです。 |
|
投稿日時: 2002-08-01 13:32
> <tag1>&amp#160</tag1>
ということは、put_nodeValue()で、自動的にエスケープしているということですね。 であれば、そのままエスケープせずに指定すればよいはずです。 すなわち、「 」を書き込めば、 <tag1>&#160</tag1> になるはずです。 _________________ Paul K.Nakagome |
|
投稿日時: 2002-08-01 13:52
返答ありがとうございます。
すいません。私の書き方が悪かっようです。 最終的にXMLに書き込んだ時に <tag1> </tag1> となるようにしたいのです。 |
|
投稿日時: 2002-08-02 10:33
こんにちは
>tag1、tag2、tag3の出現が不規則 > つまり > > <root> ><tag1/> ><tag3/> ><tag2/> ><root> > >でもOKとなるようなDTDは定義出来ないのでしょうか? できません。DTDにはそのような内容モデルを定義する文法が存在しません。 XML Schemaでは以下のようにして表現できます。 <xsd:all> <xsd:element name="tag1"/> <xsd:element name="tag2"/> <xsd:element name="tag3"/> </xsd:all> 以上の定義は「どんな順番でも良いから必ず1つは現れなければならない」ことを意味します。 ちなみに、一応以下のようにすればDTDでも定義できますが、気持ち悪いです。。。。 <!ELEMENT root ((tag1, tag2, tag3) | (tag1, tag3, tag2) | (tag2, tag1, tag3) | (tag2, tag3, tag1), (tag3, tag1, tag2), (tag3, tag2, tag1)) > |
|
投稿日時: 2002-08-05 13:19
ご返答ありがとうございました。
タグの順番に関しては可変にする事は あきらめるしかなさそうですね &#160関してはもう少し 調べて見ようと思います。 |
|
投稿日時: 2002-08-05 16:26
追伸
ちょっと強引なような気がしましたが  の設定はunicodeで0xffffffa0 0x00000000 なので この値を直接設定したらうまくいきました。 _bstr_t bstrNodeData; VARIANT value; BSTR nodeData; char szData[8]; szData[0] = 0xffffffa0; szData[1] = 0x00000000; szData[2] = 0x00000000; bstrNodeData = szData; nodeData = SysAllocString(bstrNodeData); value.vt = VT_BSTR; V_BSTR(&value) = nodeData; res = pNode->put_nodeValue(value); |