XML の読み込み時または解析時に空白を維持する (LINQ to XML)

この記事では、空白に対する LINQ to XML の動作を制御する方法について説明します。

一般的なシナリオでは、インデントされた XML を読み取り、メモリ内に空白のテキスト ノードなしで (つまり空白を維持せずに) XML ツリーを作成し、XML に対して何らかの操作を実行し、インデント付きで XML を保存します。 書式を設定して XML をシリアル化する場合は、XML ツリー内の有意の空白のみが維持されます。 これが LINQ to XML の既定の動作です。

もう 1 つのよくあるシナリオは、意図的にインデントされた XML を読み取って変更する場合です。 場合によっては、このインデントを一切変更しないようにする必要があります。 LINQ to XML でこれを行うには、XML を読み込む際または解析する場合に空白を維持し、XML をシリアル化するときに書式設定を無効にします。

この記事では、空白に対する、XML ツリーを設定するメソッドの動作について説明します。 XML ツリーをシリアル化するときの空白の制御については、「シリアル化時に空白を維持する」を参照してください。

XML ツリーを設定するメソッドの動作

XElement クラスと XDocument クラスにある次のメソッドは、XML ツリーを設定します。 XML ツリーは、ファイル、TextReaderXmlReader、または文字列から設定することができます。

メソッドが LoadOptions を引数として受け取らない場合、意味のない空白は維持されません。

ほとんどの場合、メソッドが LoadOptions を引数として受け取ると、意味のない空白を XML ツリー内のテキスト ノードとして維持できます。これは、オプションの動作です。 ただし、メソッドが XmlReader から XML を読み込んでいる場合は、XmlReader によって空白を維持するかどうかが決定されます。 PreserveWhitespace を設定しても効果はありません。

これらのメソッドで空白を維持すると、意味のない空白が XText ノードとして XML ツリーに挿入されます。 空白が維持されない場合、テキスト ノードは挿入されません。

XmlWriter を使用して、XML ツリーを作成することができます。 XmlWriter に書き込まれたノードが、ツリーに挿入されます。 ただし、このメソッドを使用して XML ツリーを構築すると、ノードが空白かどうかにかかわらず、また空白に意味があるかどうかにかかわらず、すべてのノードが維持されます。