更新 : November 2007
このトピックでは、空白に対する 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 ツリーは、ファイル、TextReader、XmlReader、または文字列から設定することができます。
メソッドが LoadOptions を引数として受け取らない場合、意味のない空白は維持されません。
ほとんどの場合、メソッドが LoadOptions を引数として受け取ると、意味のない空白を XML ツリー内のテキスト ノードとして維持できます。これは、オプションの動作です。ただし、メソッドが XmlReader から XML を読み込んでいる場合は、XmlReader によって空白を維持するかどうかが決定されます。PreserveWhitespace を設定しても効果はありません。
これらのメソッドで空白を維持すると、意味のない空白が XText ノードとして XML ツリーに挿入されます。空白が維持されない場合、テキスト ノードは挿入されません。
XmlWriter を使用して、XML ツリーを作成することができます。XmlWriter に書き込まれたノードが、ツリーに挿入されます。ただし、このメソッドを使用して XML ツリーを構築すると、ノードが空白かどうかにかかわらず、また空白に意味があるかどうかにかかわらず、すべてのノードが維持されます。