« 2014年4月 | トップページ | 2014年6月 »

2014年5月の記事

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>にするかをプログラムで(個々の要素インスタンスごとに)選べる、ということでもある。

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

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

« 2014年4月 | トップページ | 2014年6月 »