- PR -

タグ内容の更新とDTDについて

投稿者投稿内容
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-08-01 10:56
MSXML4+VC6で開発をしている者です。

問題が2つ発生しました。

1.タグ内容の更新
 タグのデータを更新したいのですが
 通常のデータなら問題ないのですが
 特殊なデータ、具体的に言うと「&#160」をタグの内容に
 更新したいのですがどうしても出来ません。

<tag1>&#160;</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つバラバラですが
 分かる方 いましたらご教授願います
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-08-01 11:46
> 特殊なデータ、具体的に言うと「&#160」をタグの内容に更新したいのですがどうしても出来ません。
エスケープしてください。
< = &lt;
> = &gt;
& = &amp;
' = &apos;
" = &quot;

> <root>
>  <tag1/>
>  <tag2/>
>  <tag3/>
> <root>
終わりが</root>でないですが・・・。

_________________
Paul K.Nakagome
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-08-01 12:03
返答ありがとうございます

早速エスケープして<tag1>に書き込んで見たのですが

「&amp;#160」というのをDOMで
書き込んで見たのですが結果は

<tag1>&amp;amp#160</tag1>

となってしまいました。

具体的には

_bstr_t bstrNodeData;
VARIANT value;
BSTR nodeData;

bstrNodeData = "&amp;#160";
nodeData = SysAllocString(bstrNodeData);

value.vt = VT_BSTR;
V_BSTR(&value) = nodeData;
res = pNode->put_nodeValue(value);

こんな感じです。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-08-01 13:32
> <tag1>&amp;amp#160</tag1>
ということは、put_nodeValue()で、自動的にエスケープしているということですね。
であれば、そのままエスケープせずに指定すればよいはずです。

すなわち、「&#160」を書き込めば、
<tag1>&amp;#160</tag1>
になるはずです。


_________________
Paul K.Nakagome
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-08-01 13:52
返答ありがとうございます。

すいません。私の書き方が悪かっようです。

最終的にXMLに書き込んだ時に

<tag1>&#160;</tag1>

となるようにしたいのです。
なまちゅ
会議室デビュー日: 2002/07/26
投稿数: 6
投稿日時: 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/04/11
投稿数: 10
投稿日時: 2002-08-05 13:19
ご返答ありがとうございました。

タグの順番に関しては可変にする事は
あきらめるしかなさそうですね

&#160関してはもう少し
調べて見ようと思います。
まる
会議室デビュー日: 2002/04/11
投稿数: 10
投稿日時: 2002-08-05 16:26
追伸

ちょっと強引なような気がしましたが
&#160;の設定は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);

スキルアップ/キャリアアップ(JOB@IT)