DOBON.NET DOBON.NETプログラミング掲示板過去ログ

XMLドキュメントのEncoding設定

環境/言語:[VBScript XP]
分類:[その他]

お世話になります。
環境は、XP サーバーVBScriptにて以下の通り、Encoding設定を
行おうとしているのですが、出力結果は、Versionしか出力されません。

Webのサンプルでは、出力結果にencodingも含まれているのですが、何が
問題なのでしょうか?ご教授願います。

Set MyDocument = CreateObject("MSXML2.DOMDocument")
Set MyxmlNode = MyDocument.createProcessingInstruction("xml", "version='1.0' encoding='Shift_JIS'")
MyDocument.appendChild MyxmlNode

<?xml version="1.0"?>      ←出力結果
2009/02/21(Sat) 11:33:28 編集(投稿者)

■No24049に返信(toheheさんの記事)
> 環境は、XP サーバーVBScriptにて以下の通り、Encoding設定を
> 行おうとしているのですが、出力結果は、Versionしか出力されません。

Version/Encoding ですか? version/encoding ではなく?
<?xml version="1.0" encoding="Shift_JIS"?>
ならば問題ありませんが、
<?xml Version="1.0" Encoding="Shift_JIS"?>
という XML 宣言は不正ですよ。
http://www.w3.org/TR/xml/#NT-XMLDecl


> Webのサンプルでは、出力結果にencodingも含まれているのですが、

その結果を、どのようにして確認していますか?
save メソッドではなく、xml プロパティを使っていたりはしませんか?

xml プロパティは、常に Unicode 文字列(UTF-16)として処理される事に
なっており、XML 宣言中の encoding 指定も除去される仕様です。

[save Method (DOMDocument)]
http://msdn.microsoft.com/en-us/library/ms753769.aspx

[xml Property]
http://msdn.microsoft.com/en-us/library/ms755989.aspx


たとえば、下記のコードを試してみてください。

'--------------------------
Set MyDocument = CreateObject("MSXML2.DOMDocument")
Set MyxmlNode = MyDocument.createProcessingInstruction("xml", "version='1.0' encoding='Shift_JIS'")
MyDocument.appendChild MyxmlNode
MyDocument.appendChild MyDocument.createComment("あいうえお")
MyDocument.appendChild MyDocument.createElement("NodeElement")

Set StmSJIS1 = CreateObject("ADODB.Stream")
Set StmSJIS2 = CreateObject("ADODB.Stream")
StmSJIS1.Charset = "Shift_JIS"
StmSJIS2.Charset = "Shift_JIS"
StmSJIS1.Open
StmSJIS2.Open
MyDocument.Save StmSJIS1
MyDocument.Save StmSJIS2

StmSJIS1.Position = 0
S1 = StmSJIS1.ReadText() '出力結果 S1
StmSJIS1.Close

Const adSaveCreateOverWrite = 2
StmSJIS2.SaveToFile "C:\work\S2.xml", adSaveCreateOverWrite '出力結果 S2
StmSJIS2.Close

S3 = MyDocument.XML '出力結果 S3

MyDocument.save "C:\work\S4.xml" '出力結果 S4
'--------------------------

上記の場合、S3 の XML 宣言のみ、encoding 指定が付きません。一方、
S1, S2, S4 には encoding="Shift_JIS" が付属しているかと思います。しかし
コードで指定した encoding='Shift_JIS' ではない事に注意してください。


<?xml 〜?> すなわち XML 宣言(XML declaration)は、処理命令(PI:processing instructions)とは
区別されるべき存在ですが、便宜上、MSXML の DOM では PI の一種として処理される事になっています。
(ちなみに .NET の DOM だと、これらを別物(XmlDeclaration / XmlProcessingInstruction)とみなします)

とはいえ、MSXML にとっても、XML 宣言は特別な物であるようで、先のように
XML プロパティでの encoding の除去が行われたり、「'」→「"」のような正規化が
行われてしまうようですね。
xmlプロパティで確認していました。
魔界の仮面弁士さんの言われる通りに動作していることを確認しました。
ありがとうございました。

 ひとつ疑問点があるのですが、XMLに日本語をいれ、言語の異なるアプリケーション間で、連携させる場合は、Documentオブジェクト(Aアプリ:Save)→XMLファイル→Documentオブジェクト読み込み(Bアプリ:load)という流れで、必ず、ファイル化しなければならないのでしょうか?

 Documentオブジェクト(Aアプリ:xml)→変数→Documentオブジェクト読み込み(Bアプリ:loadXML)ということを考えていたのですが、上記のように日本語ではうまくいかず困っていました。具体的には、HTML内にxmlプロパティの内容を吐き出して、クライアントスクリプトでloadXMLをするというものです。

ベストな処理ロジックは、どのようになるとお考えでしょうか?ご意見頂きたく。
■No24107に返信(toheheさんの記事)
> 言語の異なるアプリケーション間で、
『言語』とは、日本語(Shift_JIS/EUC-JP)や中国語(GB2312S/BIG5)などの
encoding 指定のことでしょうか?

それとも、VB6/VB.NET/C#/Delphi/JScript/JScript.NET などの
コンピュータ言語のことでしょうか?


> Documentオブジェクト(Aアプリ:Save)→XMLファイル→Documentオブジェクト読み込み(Bアプリ:load)という流れで、必ず、ファイル化しなければならないのでしょうか?
ファイル化せずに、ストリームとして受け渡すこともできます。

save メソッドに指定できる引数は、保存先のパス(文字列型)だけでは
ありません。たとえば、ASP の Response ストリームを渡すこともできますし、
先述のサンプルのように、ADO の Stream を渡すこともできます。
詳細は、先に紹介した save メソッドの解説記事をご覧下さい。

また、save せずとも、Document やノード自体を受け渡すこともできますし、
あるいは先述の S1, S3 のような手法で、XML 文字列に変換する事もできますね。


> クライアントスクリプトでloadXMLをするというものです。
あれ? loadXML の時点では、encoding の有無は無関係ですよね。

If doc.loadXML("<?xml version='1.0' encoding='Shift_JIS'?><あ/>") Then
If doc.loadXML("<?xml version='1.0' encoding='UTF-8'?><あ/>") Then
If doc.loadXML("<?xml version='1.0'?><あ/>") Then
If doc.loadXML("<あ/>") Then

は、いずれも True になるかと思います。


> 具体的には、HTML内にxmlプロパティの内容を吐き出して、
現在、その部分がどのように実装されているのかは分かりませんが:

HTML と XML の連動という話であれば、ターゲットが IE なら、
XML Data Island に埋め込むと言う手もありますね。
http://msdn.microsoft.com/ja-jp/library/dd296833.aspx
http://msdn.microsoft.com/ja-jp/library/ms942498.aspx
http://www.makoto3.net/DHTML_IE_NEO2/neo2-0014.html
http://www.makoto3.net/DHTML_IE_NEO/AI-MOOK/xml_dataisland/xml_top.html

また、HTML 変換のために、XSLT を用いると言う方法もあるかな。
http://www.makoto3.net/xml_sample/sample019.html
http://www6.airnet.ne.jp/manyo/xml/sample2/step3.html
『言語』は、コンピュータ言語を指していました。

>save メソッドに指定できる引数は、保存先のパス(文字列型)だけでは
>ありません。たとえば、ASP の Response ストリームを渡すこともできますし、
>先述のサンプルのように、ADO の Stream を渡すこともできます。
>詳細は、先に紹介した save メソッドの解説記事をご覧下さい。

なるほど!勉強になります。

>あれ? loadXML の時点では、encoding の有無は無関係ですよね。

>If doc.loadXML("<?xml version='1.0' encoding='Shift_JIS'?><あ/>") Then
>If doc.loadXML("<?xml version='1.0' encoding='UTF-8'?><あ/>") Then
>If doc.loadXML("<?xml version='1.0'?><あ/>") Then
>If doc.loadXML("<あ/>") Then

>は、いずれも True になるかと思います。

タグ名に日本語は使用しないので、確認する必要がありますが、
javaの場合、
 <?xml version='1.0'?><item>項目1</item> →×
 <?xml version='1.0'? encoding='Shift_JIS'><item>項目1</item> →○
となり、encodingを指定する必要があります。(実証済みです。)

XML Data Island←初めて聞く言葉です。少し勉強します。

途中報告まで。 ご回答ありがとうございます。

DOBON.NET | プログラミング道 | プログラミング掲示板