プロが教える店舗&オフィスのセキュリティ対策術

Windows2000 ServerにおいてVBScriptとMicrosoft.XMLDOMを用いてASPスクリプトを作成しています。

XMLで特殊文字<,>,",',&を扱う際には&lt;,&gt;,&quot;,&apos;に置換しなくてはならない事はわかったんですが、
実際にReplaceすると例えば&lt;が&amp;lt;になってしまいます。
置換する順番を変えてもこうなるのでおかしいと重い、&amp;への置換を止めてもです。
しかもこれは読み出すと何事も無かったかのように&amp;lt;が&lt;へと戻っています。

試しに置換を全く行わない状態で
「テスト&'>"」という文字列を保存してみると、
保存先ファイルの中では「テスト&amp;'&gt;&quot;」という状態になっていました。

恐らく&,<,>,"が勝手に置換され、読み出される時には元に戻す処理が行われていると思うんですが、これがどの部分で行われているのかがよくわかりません。
JavaScriptで読み出した際にも同様に復元されていたようなので、MSXMLの仕様なのかなと思うんですが、それを裏付ける資料を見つける事もできませんでした。

XMLにおける特殊記号の扱いについて書いているサイトにも記述が見つからなかったので、もしかしたら凄く基本的な事だったりおかしな質問だったりするのかもしれませんが、ご存知の方がいらっしゃいましたら是非ご教授願いたいです。
参考URLだけでも良いですのでどうかよろしくお願いします。

A 回答 (4件)

どんなデータをどんなスクリプトでどう処理しているか


補足していただけますか

この回答への補足

例えば、このようなXMLデータ

<?xml version="1.0" encoding="Shift_JIS"?>
<testRoot>
<item mytext="test">text</item>
<item mytext="attr">text2</item>
</testRoot>

を用意し

<%@ Language="VBScript" %>
<% Option Explicit %>
<%
Dim DATA_PATH
DATA_PATH = Server.MapPath("/test.xml")

Dim xmlDoc
Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")
xmlDoc.async=False
xmlDoc.load(DATA_PATH)

Dim node
Set node = xmlDoc.documentElement.childNodes.item(0)
node.attributes.item(0).nodeValue = "test&lt;"
xmlDoc.save(xmlDoc.url)
%>
<html>
<head><title>test</title></head>
<body>
<%= node.attributes.item(0).nodeValue %>
</body>
</html>

以上のスクリプトを動かすとします。
(単に一つめのitemの属性値を変えているだけです)
すると、test&lt;がtest&amp;lt;になってしまう、というわけです。

よく考えると、<,>,"については自分で&lt;,&gt;,&quot;にしていて、それを保存する際に&が勝手に&amp;となる事が問題でした。
考えが定まっていない状態での不確かな質問で申し訳ないです。

この、&が勝手に&amp;に変換されるという部分に関して何らかのソースはありませんでしょうか。

補足日時:2006/02/27 03:47
    • good
    • 0

node.attributes.item(0).nodeValue = "test>"


でいいということだと思いますが
    • good
    • 0

#2>node.attributes.item(0).nodeValue = "test>"


node.attributes.item(0).nodeValue = "test<"
の間違いですね

>MSXMLの仕様なのかなと
MSXMLのリファレンスで

According to the W3C DOM specification, an XML parser can completely expand entity references into entities before the structure model is passed to the DOM. When these entity references are expanded, the document tree does not contain any entity references.

When Microsoft&reg; XML Core Services (MSXML) validates the XML document, it expands external entities (except binary entities). The nodes representing the expanded entity are available as read-only children of the entity reference. The Microsoft implementation does not expand these entities when it is not validating.

とあるので、仕様かと思います。
(英語力が低いので、何ですが、W3C DOM の求めるところで、XMLパーサーは、DOMに変換するにあたってエンティティの展開をするべきということかな?、なんにしても、XMLパーサーとしては、変換するか、エラーにするかしないといけませんが、エラーにしてたら使い勝手の悪いものになると思います。)
ちなみに、
xmlDoc.createEntityReference("lt")
のようにして&lt;エンティティを作成できます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かに勝手に変換しているのですね。
おかげさまですっきりしました。

お礼日時:2006/03/01 04:50

何のためにエスケープしているのかを考えれば、わかりやすいかと。



&<>"'などをエスケープしなければならないのはそのXMLを文字列として表現するときの話です。そうしないと、タグなのか単なる文字なのか識別できません。
しかし、DOMドキュメントオブジェクトを扱うときには<?xml・・・という「文字列」ではなくて、もっと抽象的なツリー構造を操作しているのですから、気にしなくてもよい話です。

もちろん逆に
<elem>&</elem>
のようなXMLファイルも、DOMのAPIで操作すればそのまま「&」という値が取得できます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かにどのような形式で保存されていようと読み出した時点で復元されていれば問題ありませんね。
仕様上そうなっている事がわかって安心しました。
つまりはXML形式で保存する為に一々エスケープしなくてはいけないと考える必要は無い(ようにしてある)という事ですね。

お礼日時:2006/03/01 04:52

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