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>にするかをプログラムで(個々の要素インスタンスごとに)選べる、ということでもある。
それはそれで便利な気がする。
※ 因みに、マイクロソフトにはめずらしく、このことはドキュメントに明記されている。私はずっと気づいてなかったけど。


最近のコメント