C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: XmlDocument クラスの書込み処理について


(過去ログ 82 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■48425 / inTopicNo.1)  XmlDocument クラスの書込み処理について
  
□投稿者/ ようこ (1回)-(2010/04/06(Tue) 09:55:20)

分類:[.NET 全般] 

お世話になっております。
Visual C# 2008においてXMLファイルを作成しています。
下記のソースを使用した場合、タグbbbを <bbb></bbb>と出力したい場合どのようにすればよろしいのでしょうか?
いろいろ試してみたのですがどうしても下記のケース@、Aのような出力になってしまいます。

 ケース@
 <bbb />

 ケースA
  <bbb>
  </bbb>

-------------------------ソース-----------------------------------
XmlDocument doc = new System.Xml.XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "Shift_JIS", "yes"));

XmlElement rootElement = doc.CreateElement("aaa");
XmlElement element = doc.CreateElement("bbb");
element.InnerText = "";
element.IsEmpty = true; //この行を処理するとケース@、コメントにするとケースA
rootElement.AppendChild(element);
doc.AppendChild(rootElement);

doc.Save(@"d:\a.xml");


以上、よろしくお願致します。
引用返信 編集キー/
■48427 / inTopicNo.2)  Re[1]: XmlDocument クラスの書込み処理について
□投稿者/ aetos (262回)-(2010/04/06(Tue) 10:41:04)
No48425 (ようこ さん) に返信
> お世話になっております。
> Visual C# 2008においてXMLファイルを作成しています。
> 下記のソースを使用した場合、タグbbbを <bbb></bbb>と出力したい場合どのようにすればよろしいのでしょうか?

つまり、改行したくないということですか?

いろいろ試してみたところ、こんなコードでうまくいきそうです。

var xws = new XmlWriterSettings() { Indent = true };

using (XmlWriter xw = XmlWriter.Create("a.xml", xws))
{
    doc.WriteTo(xw);
}

ただし、書き方がどうあれ意味は違わないということに留意してください。
XML にとっては、本質的には見た目は無意味です。見た目が重要なら別途スタイルシートでも使うべきです。
.NET Framework の将来のバージョンで、この方法が通用しなくなる可能性も十分にあります。

引用返信 編集キー/
■48431 / inTopicNo.3)  Re[1]: XmlDocument クラスの書込み処理について
□投稿者/ 魔界の仮面弁士 (1595回)-(2010/04/06(Tue) 10:48:37)
No48425 (ようこ さん) に返信
> タグbbbを <bbb></bbb>と出力したい場合どのようにすればよろしいのでしょうか?

XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "Shift_JIS", "yes"));
XmlElement rootElement = doc.CreateElement("aaa");
doc.AppendChild(rootElement);
XmlElement element = doc.CreateElement("bbb");
element.IsEmpty = false;
rootElement.AppendChild(element);

doc.PreserveWhitespace = true;
doc.Save(@"C:\a.xml");
doc.PreserveWhitespace = false;
doc.Save(@"C:\b.xml");
引用返信 編集キー/
■48434 / inTopicNo.4)  Re[2]: XmlDocument クラスの書込み処理について
□投稿者/ Hongliang (594回)-(2010/04/06(Tue) 11:00:23)
> ただし、書き方がどうあれ意味は違わないということに留意してください。
<bbb /> や <bbb></bbb> と、
<bbb>
</bbb>
じゃ意味が違っちゃいますが。後者は空白ノードが追加されています。
// XmlDocument で扱うには同じかもしれませんけど。
引用返信 編集キー/
■48436 / inTopicNo.5)  Re[2]: XmlDocument クラスの書込み処理について
□投稿者/ 魔界の仮面弁士 (1597回)-(2010/04/06(Tue) 11:13:45)
No48431 (魔界の仮面弁士) に追記
>> タグbbbを <bbb></bbb>と出力したい場合どのようにすればよろしいのでしょうか?
> doc.PreserveWhitespace = true;
> doc.Save(@"C:\a.xml");
> doc.PreserveWhitespace = false;
> doc.Save(@"C:\b.xml");

もうひとつサンプル。
a.xml / b.xml / c.xml それぞれの出力結果を比較してみて下さい。


XmlDocument doc = new XmlDocument();
doc.AppendChild(doc.CreateXmlDeclaration("1.0", "Shift_JIS", "yes"));
XmlElement rootElement = doc.CreateElement("aaa");
doc.AppendChild(doc.CreateSignificantWhitespace("\r\n"));
doc.AppendChild(rootElement);
XmlElement element = doc.CreateElement("bbb");
element.IsEmpty = false;
rootElement.AppendChild(doc.CreateSignificantWhitespace("\r\n\t"));
rootElement.AppendChild(element);
rootElement.AppendChild(doc.CreateSignificantWhitespace("\r\n"));
doc.PreserveWhitespace = true;
doc.Save(@"C:\c.xml");
引用返信 編集キー/
■48437 / inTopicNo.6)  Re[3]: XmlDocument クラスの書込み処理について
□投稿者/ ようこ (2回)-(2010/04/06(Tue) 11:16:00)
皆様ご返信ありがとうございます。
先ほどのはXMLが

<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<aaa>
<bbb>
</bbb>
</aaa>

と出力されるので、これを、

<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<aaa>
<bbb></bbb>
</aaa>

としたいと考えていました。
bbbのみ空白を削除したかったのですが、
正規化をするとどちらも同じ意味合いなので、
空白ノードが入ってもOKとしたいと思います。
ありがとうございました。


解決済み
引用返信 編集キー/
■48442 / inTopicNo.7)  Re[3]: XmlDocument クラスの書込み処理について
□投稿者/ aetos (264回)-(2010/04/06(Tue) 12:20:16)
2010/04/06(Tue) 12:20:28 編集(投稿者)

No48434 (Hongliang さん) に返信
> <bbb /> や <bbb></bbb> と、
> <bbb>
> </bbb>
> じゃ意味が違っちゃいますが。後者は空白ノードが追加されています。
> // XmlDocument で扱うには同じかもしれませんけど。

はい。おっしゃるとおりです。テキトーなこと言いました。すいません。
ただ、(今回のケースではスキーマがありませんが)混合要素でないところにこのような空白があってもエラーにはなりません。
また、出力したドキュメントを扱う側で、その空白ノードの有無に依存した処理(あるいは、<bbb/> と <bbb></bbb> で動作が変わるような処理)を組むべきではありません。

確実を期すならば、魔界の仮面弁士さんのおっしゃるように、PreserveWhiteSpace = true とした上で、改行が必要な個所には明示的に入れるのがいいのかもしれません。
煩雑ではありますが。
解決済み
引用返信 編集キー/
■48443 / inTopicNo.8)  Re[4]: XmlDocument クラスの書込み処理について
□投稿者/ 魔界の仮面弁士 (1598回)-(2010/04/06(Tue) 12:39:45)
No48442 (aetos さん) に返信
> その空白ノードの有無に依存した処理(あるいは、<bbb/> と <bbb></bbb> で動作が変わるような処理)を組むべきではありません。

これから組む物に対してはそうであっても、過去との互換性のために、
その違いを意識しなければならないケースもあるかと思います。

たとえば XHTML 1.0 においては、「<br></br>」ではなく「<br />」を使うことが望まれています。
http://www.w3.org/TR/xhtml1/#C_2
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -