2

XML ファイルを取り込み、要素を追加して編集し、保存するツールを作成しています。注意が必要な点は、XML ファイルを人間が読めるように維持する必要があることです。この場合、それは完全なフォーマットを意味するものではありません。

入力 XElement には、次のような多くのパラメーターが含まれています。

<Parameter key="lorem"> <Vector> <Value>2</Value><Value>3</Value> </Vector>     </Parameter>
<Parameter key="lorem"> <Vector> <Value>2</Value><Value>3</Value> </Vector> </Parameter>
<Parameter key="lorem"> <Vector> <Value>2</Value><Value>3</Value> </Vector> </Parameter>
<Parameter key="lorem"> <Vector> <Value>2</Value><Value>3</Value> </Vector>    </Parameter>
<Parameter key="lorem">
    <Parameter key="ipsum">
        <Parameter key="dolor">
            <Vector> <Value>3</Value> <Value>4</Value> </Vector>
        </Parameter>
    </Parameter>
</Parameter

名前が「Vector」および「Value」のすべての XElement でインデントを無効にしますが、名前が「Parameter」のすべての XElement でインデントを維持します。

私のコードで既存の書式設定を台無しにすることは許可されていないため、ソース ドキュメントで LoadOptions.PreserveWhitespace を使用する必要があります。ただし、これにより、ドキュメントに追加するすべての XElements の書式設定が失われます。ドキュメント全体では適用されませんが、特定の XElement に強制的にフォーマットを適用する方法はありますか?

4

3 に答える 3

1

これはあなたが求めている答えのように見えます。

この問題を解決する鍵は、XML ツリーを反復処理する再帰関数を作成し、特別に作成された XmlWriter オブジェクトにさまざまな要素と属性を書き込むことです。インデントされた XML を書き込む「外側の」XmlWriter オブジェクトと、インデントされていない XML を書き込む「内側の」XmlWriter オブジェクトがあります。

再帰関数は、最初に「外側の」XmlWriter を使用し、TextBlock 要素が表示されるまで、インデントされた XML を書き込みます。TextBlock 要素が検出されると、「内部」XmlWriter オブジェクトが作成され、TextBlock 要素の子要素が書き込まれます。また、「内側」の XmlWriter に空白を書き込みます。

「内側」の XmlWriter オブジェクトが TextBlock 要素の書き込みを完了すると、ライターが書き込んだテキストは、WriteRaw メソッドを使用して「外側」の XmlWriter に書き込まれます。

于 2012-11-14T07:21:30.137 に答える
0

不快ではあるがおそらく「代替案の中で最も邪悪なもの」の1つは、要素を作成するときに必要な空白を自分で追加することです。そうすれば、保存するときにすべての空白を保持することができ、それで問題ありません。インデントを自分で行う方法(ツリーのどこまで下にあるかを調べ、適切な数のスペースを追加する)を理解することを意味しますが、それほど苦痛ではありません。

于 2012-11-14T07:13:14.157 に答える
0

おそらく、XmlWriter から継承してシリアル化規則をエンコードし、このカスタム XmlWriter を使用して XDocument を保存する必要があります。

于 2012-11-14T06:59:05.457 に答える