こんにちは。
再度MSXMLの質問です。
環境は、
VC++2005
PlatformSDK
Windows2000/XP
です。
xmlファイルをMSXMLを使用して出力しているのですが、内容を確認してみると改行がされていませ
ん。
改行するようにしたいのですがどうしたらよいでしょうか?
現状はこんな感じです。
------------------------------------------
<?xml version=1.0 encoding=Shift_JIS?>
<root><test>1</test></root>
------------------------------------------
これをこんな風に修正したい
------------------------------------------
<?xml version=1.0 encoding=Shift_JIS?>
<root>
<test>1</test>
</root>
------------------------------------------
現状の出力プログラム
------------------------------------------
>// XML DOCインターフェイス作成
IXMLDOMDocumentPtr pDoc;
hr = pDoc.CreateInstance(CLSID_DOMDocument);
>// 一行目
IXMLDOMProcessingInstruction *pProcInst;
pDoc->createProcessingInstruction( _T(xml), _T(version='1.0'
encoding='Shift_JIS'), &pProcInst );
pDoc->appendChild( pProcInst, NULL );
>// testタグ
IXMLDOMElementPtr pTest;
IXMLDOMTextPtr pText;
pDoc->createElement( _T(test), &pTest );
pDoc->createTextNode( _T(1), &pText );
pTest->appendChild( pText, NULL );
>// ルートタグ
IXMLDOMElement *pRoot;
pDoc->createElement( _T(root), &pRoot );
pRoot->appendChild( pTest, NULL );
pDoc->appendChild( pRoot, NULL );
>// セーブ
pDoc->put_async(VARIANT_FALSE);
hr = pDoc->save( _variant_t( filename ) );
-------------------------------------------
こんな感じです。
エラーコードは省いてあります。
MSXMLは使い始めてまだ間もないため、試行錯誤しつつ実践で導入しています。
よろしくおねがいします。
MXXMLWriterを使えばある程度整形してくれます。
(が、思っているとおりにはなるとは限りません。)
これ↓と
> ------------------------------------------
> <?xml version=1.0 encoding=Shift_JIS?>
> <root><test>1</test></root>
> ------------------------------------------
これ↓の
> ------------------------------------------
> <?xml version=1.0 encoding=Shift_JIS?>
> <root>
> <test>1</test>
> </root>
> ------------------------------------------
違いが理解できますか?
上の2つはXML的には異なるものです。
そこが理解できればあとはやることはわかるはず。
ということでまずは上の2つの違いを調べましょう。
返信ありがとうございます。
MXXMLWriterは魅力的な感じですが、先にkureさんの情報を調べてみました。
> 上の2つはXML的には異なるものです。
rootの内容に改行が入ってるか入ってないかってことですよね?
テキスト的にも異なるものですけど、たぶんそういうことだと解釈しました。
早速それっぽい実装をしてみました。
-------------------------------------------
>// 改行ノード作成
IXMLDOMTextPtr pLF;
pDoc->createTextNode( _T(\n), &pLF );
>// ルートタグ
IXMLDOMElement *pRoot;
pDoc->createElement( _T(root), &pRoot );
pRoot->appendChild( pLF, NULL );
pRoot->appendChild( pTest, NULL );
pRoot->appendChild( pLF, NULL );
pDoc->appendChild( pRoot, NULL );
-------------------------------------------
他にもいろいろ試してみたのですが、たまに意図どおりに改行が入らないことがありますが、一応改
行は実現できました。
ありがとうございます。
意図どおりに改行が入れられるようにもう少しがんばってみます。
意図どおりにならないのは、タブを使って試した時だけみたいです。
IXMLDOMTextPtr pLF, pTab;
pDoc->createTextNode( _T(\n), &pLF );
pDoc->createTextNode( _T(\t), &pTab );
....
pRoot->appendChild( pLF, NULL );
pRoot->appendChild( pTab, NULL );
....
pDoc->appendChild( pRoot, NULL );
------------------------------------------
こんな感じだと、タブは入るのに改行されてないことがしばしば。
pRoot->put_text( _T(\n\t) );
みたいな感じでやると結構うまくいくみたいですね。
やっぱり、↓これじゃあんまりうまくいかないみたいです。
pDoc->createTextNode( _T(\n), &pLF );
pRoot->appendChild( pLF, NULL );
saveとloadを繰り返して一要素ずつ保存すると何故か改行されてます。
あと無理やりやろうと思って、
pRoot->put_text( _T(\n\t<test>1</test>\n) );
とかやると改行はうまくいくんですが、 <> が lt; gt; とかに変換されます。
put_nodeValueだと、<>は正常に出るんですが、改行されない;;
ネットのサンプル見ると改行処理とかしてなくても出力結果が整形されてるのをよくみかけるんです
が、MSXML4とやらを使ってるからかな?
まあ、MSXML4はdllも配布しないと使えない(?)ので使うつもりはありませんが。
ってことでまだ解決してません。
情報求む。
> saveとloadを繰り返して一要素ずつ保存すると何故か改行されてます。
これがよーわからん。
loadしたものをsaveしたら当然元のTextノードが保持されてるわけだから、
改行がくっついて当たり前だと思うんですけど?
もちっとちゃんと問題を切り分けないと何が悪いのかわからんよ。
> こんな感じだと、タブは入るのに改行されてないことがしばしば。
↑にもなにかしらちゃんとした理由があるはず。
質問者自体が問題を理解してないと、こっちは何も答えられないよ。
> 質問者自体が問題を理解してないと、こっちは何も答えられないよ。
そうかもしれません。
> saveとloadを繰り返して一要素ずつ保存すると何故か改行されてます。
> こんな感じだと、タブは入るのに改行されてないことがしばしば。
この辺もわからないながらも、いろいろ実験した結果です。
なんていうか、質問もしてるけど、自分でもそれに頼らずいろいろ解決法を探ってますよ。というア
ピールです。
なんだかんだ言ってますけど、
要はMSXMLを使ってこれを出力したいだけなんです。
> ------------------------------------------
> <?xml version=1.0 encoding=Shift_JIS?>
> <root>
> <test>1</test>
> </root>
> ------------------------------------------
よろしくお願いします。