Windows2000 ServerにおいてVBScriptとMicrosoft.XMLDOMを用いてASPスクリプトを作成しています。
XMLで特殊文字<,>,",',&を扱う際には<,>,",'に置換しなくてはならない事はわかったんですが、
実際にReplaceすると例えば<が&lt;になってしまいます。
置換する順番を変えてもこうなるのでおかしいと重い、&への置換を止めてもです。
しかもこれは読み出すと何事も無かったかのように&lt;が<へと戻っています。
試しに置換を全く行わない状態で
「テスト&'>"」という文字列を保存してみると、
保存先ファイルの中では「テスト&'>"」という状態になっていました。
恐らく&,<,>,"が勝手に置換され、読み出される時には元に戻す処理が行われていると思うんですが、これがどの部分で行われているのかがよくわかりません。
JavaScriptで読み出した際にも同様に復元されていたようなので、MSXMLの仕様なのかなと思うんですが、それを裏付ける資料を見つける事もできませんでした。
XMLにおける特殊記号の扱いについて書いているサイトにも記述が見つからなかったので、もしかしたら凄く基本的な事だったりおかしな質問だったりするのかもしれませんが、ご存知の方がいらっしゃいましたら是非ご教授願いたいです。
参考URLだけでも良いですのでどうかよろしくお願いします。
No.3ベストアンサー
- 回答日時:
#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® 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")
のようにして<エンティティを作成できます。
No.4
- 回答日時:
何のためにエスケープしているのかを考えれば、わかりやすいかと。
&<>"'などをエスケープしなければならないのはそのXMLを文字列として表現するときの話です。そうしないと、タグなのか単なる文字なのか識別できません。
しかし、DOMドキュメントオブジェクトを扱うときには<?xml・・・という「文字列」ではなくて、もっと抽象的なツリー構造を操作しているのですから、気にしなくてもよい話です。
もちろん逆に
<elem>&</elem>
のようなXMLファイルも、DOMのAPIで操作すればそのまま「&」という値が取得できます。
ありがとうございます。
確かにどのような形式で保存されていようと読み出した時点で復元されていれば問題ありませんね。
仕様上そうなっている事がわかって安心しました。
つまりはXML形式で保存する為に一々エスケープしなくてはいけないと考える必要は無い(ようにしてある)という事ですね。
No.1
- 回答日時:
どんなデータをどんなスクリプトでどう処理しているか
補足していただけますか
この回答への補足
例えば、このような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<"
xmlDoc.save(xmlDoc.url)
%>
<html>
<head><title>test</title></head>
<body>
<%= node.attributes.item(0).nodeValue %>
</body>
</html>
以上のスクリプトを動かすとします。
(単に一つめのitemの属性値を変えているだけです)
すると、test<がtest&lt;になってしまう、というわけです。
よく考えると、<,>,"については自分で<,>,"にしていて、それを保存する際に&が勝手に&となる事が問題でした。
考えが定まっていない状態での不確かな質問で申し訳ないです。
この、&が勝手に&に変換されるという部分に関して何らかのソースはありませんでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- CAD・DTP Auto CAD LT → Auto CAD 1 2022/04/20 12:29
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- Excel(エクセル) vba レジストリの値を読み込教えてください教えてください 1 2023/07/14 14:09
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- JavaScript Q&Aの掲示板を作成していてヤフー知恵袋やgoo質問のように質問ごとにURLを生成したい 5 2023/08/04 01:22
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あせんうぶり言語
-
isnan・isnf関数が「識別子が見...
-
Visual Basic .NET の識別子は...
-
XML、XSLTの適応エラー(IEから...
-
SNMP リンクダウンとノードダ...
-
XMLで要素が記述された順番に意...
-
タグの有無の判定
-
XSLで、XMLの空タグを制御したい。
-
あるノードリストに、特定の名...
-
HTTPステータス 404 - There is...
-
XMLファイル内のデータ(値)を変...
-
ルート要素ノードが2個ある場合?
-
getElementsByNameの要素数が取...
-
Listからのnull要素を削除方法は?
-
html→xmlの変換
-
コンテキストメニュークリック...
-
Excel-VBAでXMLの複数ノードの...
-
このエラー、何とかなりません...
-
xsltを利用して変換後改行が入る
-
昔Winnyってありましたけど、あ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
東芝のDynabookなのですがアン...
-
特殊記号が勝手にエスケープさ...
-
Visual Basic .NET の識別子は...
-
MSXML で Windows-31J のキャラ...
-
isnan・isnf関数が「識別子が見...
-
Excelマクロについて
-
使用できる文字の規約
-
VB 6.0でtimerをとselect case...
-
VBでの質問です
-
C# listviewでサブアイテムを順...
-
MSXML3でerror: 'C2065 IID_IXM...
-
CPUの考え方を教えてください ...
-
昔Winnyってありましたけど、あ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
バッチファイルでテキストファ...
-
XMLで要素が記述された順番に意...
-
UTF-8でエンコーディングとはど...
-
あるノードリストに、特定の名...
-
google croud にあるファイルを...
おすすめ情報