« Visual Studio ExpressでNSISを使う | トップページ | 食洗日記をひさしぶりに更新 »

2014年5月 3日 (土)

LINQ to XMLには「空のテキストノード」が存在する

Linq to XMLを使ってXMLツリーを生成し、XElement.Save() でXML文書として書き出すときの話。new XText("") ってやると、内容が空文字列であるXTextオブジェクトができる。しかも、これを要素の(唯一の)内容にしても、自動的に消えたりせずに保存される。

例を示そう。

new XElement("foo", new XText("")).Save("foo.xml");

とやると、

<foo></foo>

という文書ができる。(実際にはXML宣言が付くが省略。)

他方、

new XElement("foo").Save("foo.xm");

だと

<foo />

になる。

つまり、空のテキストノードがあるのか、何もないのかが区別されているのだ。

これは、本来のXMLのインフォセットというかデータモデルというか、それとは違うわけで、気持ち悪いのだが、しかし、これを積極的に利用すると、シリアライズ後に空要素を<foo />にするか<foo></foo>にするかをプログラムで(個々の要素インスタンスごとに)選べる、ということでもある。

それはそれで便利な気がする。

※ 因みに、マイクロソフトにはめずらしく、このことはドキュメントに明記されている。私はずっと気づいてなかったけど。

« Visual Studio ExpressでNSISを使う | トップページ | 食洗日記をひさしぶりに更新 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/285638/56042351

この記事へのトラックバック一覧です: LINQ to XMLには「空のテキストノード」が存在する:

« Visual Studio ExpressでNSISを使う | トップページ | 食洗日記をひさしぶりに更新 »