MSXMLでの新規作成時、XMLファイルに改行コードは入れることは可能ですか。


WEB無知  2005-04-15 05:55:29  No: 120972

環境:
  言語[VB6.0] XMLパーサ[MSXML4.0](多分)

ペンネームにもある通り、WEB関係についての知識は余りありません。
以下に、質問内容を記述しますが、あほなことを言っているようであれば、
ご指摘いただければと思います。(勉強します。)

XML形式のファイルの読み込み/新規書込み処理を実装する為、MSXMLを使用しています。(更新は無し)

こちらの掲示板の履歴等を活用しまして、何とか読込処理は実装できそうな
形まで辿り付き、書込みについても要素、属性、CDATA等の値を生成し、
生成後もブラウザで想定どおりの階層構造で表示できることまで確認しました。

但し、エディタ等で開いてみると行数的には2行で出力されています。
1行目:<?xml version="1.0"?>
2行目:<House Address="abc" Name="123"><Member Name ="xxx"/></House>

この2行目以降をなんとかタグ間等で、テキストとしても改行された状態で生成したいのですが、
MSXMLでの制御は無理なのでしょうか?

もしかしたら、XML(もしくはパーサ)というのは改行というものを意識するものでは
無く、おかしなことを言っているのかもしれませんが、納品先でブラウザが無く、
エディタ等でしかデータの確認ができない場合に、クレームが予想されますので、
ご質問させていただきました。

以下、へぼいとは思いますが、書込み処理のソースです。
--------------------------------------------
    '' XML定義
    Set domDoc = New DOMDocument
    '' XML修飾文?生成
    Set domDeclare = domDoc.createProcessingInstruction("xml", "version=""1.0""")
    
    '' XML修飾文アペンド
    Call domDoc.appendChild(domDeclare)
    
    '' 要素の生成と属性の設定処理   
    '' 要素の生成
    Set domRootEle = domDoc.createElement("Sample")

    Call domRootEle.setAttribute("x", "XXX")
    Call domRootEle.setAttribute("y", "YYY")
    Call domRootEle.setAttribute("z", "ZZZ")

    ''子ノードの要素取得
    Set dom2ndElmnt = domDoc.createElement("Test")
    Call domRootEle.appendChild(dom2ndElmnt)
    
    Call dom2ndElmnt.setAttribute("a", "AAA")
    Call dom2ndElmnt.setAttribute("b", "BBB")
    Call dom2ndElmnt.setAttribute("c", "CCC")

    ・・・(中略)・・・
    'CDATAセクションを設定
    Set domCdata = domDoc.createCDATASection("ABCDEFGHIJKLMN")
    Call dom4thElmnt.appendChild(domCdata)
    ''書込み
    Call domDoc.Save("C:\SAMPLE.XML")
--------------------------------------------------------------

ただ、一度実験で、改行コードを含んだXMLファイルを読み込み、
そのまま別ファイル名で書込み(save)処理を行い、Diffをとりました。
そうすると改行位置は異なっているのですが、書込みした方は改行された状態で
保存されていました。
各要素や属性等のデータは全て同じでした。
書き込み前のデータは改行のみで、とくにタブ等はいれていなかったのですが、
書込み後のファイルは綺麗にネストされていて、タブも自動で入っていたみたい
です。

このようなことを体験すると、新規作成でもそのような構造にしたいと
思いを寄せているのですが、なかなかそのように行きません。
新規作成と読込後保存(更新)でどのようにオブジェクトの動作が違うのかなど
も教えていただけるとありがたいです・・・図々しいですが(^^;;;

現在、書込み処理は、"appendChild"を使用する以外のスキルは私には
ありません。
もし、なにかいい方策、抜け道等ありましたら、宜しくご教授お願い致します。


魔界の仮面弁士  2005-04-15 21:03:17  No: 120973

# MSXML関係は、最近使っていないので忘れ気味……。

> MSXMLでの新規作成時、XMLファイルに改行コードは入れることは可能ですか。
単純に改行を入れるだけなら、
  Set Root = DomDoc.createElement("Root")
  Root.text = vbNewLine
だとか、あるいは、子ノードの前後に改行を加えるために、
  Call Root.appendChild(domDoc.createTextNode(vbNewLine))
  Call Root.appendChild(domDoc.createElement("Child"))
  Call Root.appendChild(domDoc.createTextNode(vbNewLine))
などといった処理を行うことで実現できます。

ただし、XML的に言えば、
  <a><b /></a>
と、
  <a>
    <b />
  </a>
は、別の構造を示しているという点には気をつけてください。

前者は、a要素ノードの中身はb要素ノードだけですが、
後者のa要素のノードの中身は、テキストノード(改行+空白)、
b要素ノード、テキストノード(改行)の3つが存在することになります。

> '' XML修飾文?生成
XML宣言(XML Declaration)ですね。
http://www.atmarkit.co.jp/aig/01xml/declaration.html

>     ・・・(中略)・・・
省略するのは構いませんが、せめて、残ったコードだけを貼り付けたときに、
ある程度動作するようなコードにしていただけるとありがたいです。(^^;

少なくとも、提示されたコードでは
> 2行目:<House Address="abc" Name="123"><Member Name ="xxx"/></House>
という結果になるとも思えませんし。

> 書込み後のファイルは綺麗にネストされていて、タブも
> 自動で入っていたみたいです。
DOMDocument の 『preserveWhiteSpace プロパティが False の状態』で
loadメソッド(≠loadXMLメソッド)を使う事で、ホワイトスペースのみの
テキストノードがノードのインデントとして整形されて読み込まれますね。

なお、loadメソッドには、ファイル名("C:\SAMPLE.XML")を渡すことも
できますし、他のストリームを渡すことも可能です。

Set domDoc2 = New MSXML2.DOMDocument50
domDoc2.preserveWhiteSpace = False
domDoc2.async = False
domDoc2.load domDoc
Debug.Print domDoc2.xml


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加