餃子を食べるとき、何をつけますか?

MSXMLを使って、属性の値に特殊文字(「<」「>」「&」など)が
大量に使われているXMLを読みこもうとすると失敗します。
正常なXMLと認識されないようです。

「Load」を使ってファイルから読み込んだ場合もダメ。
「LoadXML」で文字列から読み込んだ場合もダメ。

以下のようなVBAコードで再現できます。
---------
Dim oDom As New MSXML2.DOMDocument

With oDom.appendChild(oDom.createElement("root"))
  With .Attributes.setNamedItem(oDom.createAttribute("attr"))
    '.nodeValue = String(65533, "<") 'OK
    .nodeValue = String(65534, "<") 'NG
  End With
End With

oDom.loadXML oDom.XML '←正しく読み込めない
---------
MSXML4でもMSXML6でも同様でした。
これはバグ、それとも仕様なのでしょうか。
探してもそれらしい資料が見つかりません。
どなたかわかる方、教えてください。

補足ですが、
実は同様のXMLファイルをIE6に読ませようとした場合にも、エラー表示されます。
エラーメッセージは「エラーを特定できません」。
FireFoxだとOKのようです。

A 回答 (1件)

 私もXSLの動作実験をしてみて、< がエラーになり困った覚えがあります。

エスケープシーケンスの &gt; で記述し、対処しましたが、おそらく、クロスサイトスクリプティング攻撃を防ぐために、タグとマルチコマンド区切り記号などを読まないようにしているのだろうと考えています。
 一度、エスケープシーケンスに変換する関数か独自の置き換えルーチンを経た文字列を扱えばよろしいでしょう。

この回答への補足

回答ありがとうございます。

一応、エスケープについては考慮していました。
たとえば「<」の繰り返しを属性に入れると以下のようなXMLになりますが、

<root attr="&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;" />

この「&lt;」を、ある程度以上(65534回ほど?)繰り返すと、とたんにMSXMLで読み込めない、IEでもエラーになって表示できなくなります。
いくつかの環境で試しましたが今のところ再現性があります。


ちなみに何がやりたかったかというと、属性に別のXMLデータを文字列として格納しようとしたのです。
XMLなので、結果的に「<」「>」がたくさん出てきて、(エスケープしていても)今回の現象が発生しました。

属性にそんな大きなデータを入れるな、ということなのかもしれませんが。
ただそれを裏付けるような文献を紹介していただけると助かります。

補足日時:2009/12/31 20:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報