Condittionaly启用/禁用子项的自动格式

时间:2012-11-14 06:32:38

标签: c# xml linq linq-to-xml xelement

我正在编写一个接收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”的XElements来禁用缩进,但是所有名称为“Parameter”的XElements都要保持缩进。

由于我的代码不允许弄乱任何现有的格式,我不得不在源文档上使用LoadOptions.PreserveWhitespace。但是,这会强制我添加到文档中的所有XElements都会丢失任何格式。有没有办法可以强制特定的XElement应用格式,即使整个文档没有这样做?

3 个答案:

答案 0 :(得分:1)

This看起来像你正在追求的答案。

  

解决这个问题的关键是编写一个递归函数   遍历XML树,编写各种元素和   特殊创建的XmlWriter对象的属性。有一个'外'   写入缩进XML的XmlWriter对象和“内部”XmlWriter   写入非缩进XML的对象。

     

递归函数最初使用'外部'XmlWriter编写   缩进XML,直到它看到TextBlock元素。当它遇到   TextBlock元素,它创建'内部'XmlWriter对象,   将TextBlock元素的子元素写入其中。它也是   将空格写入'内部'XmlWriter。

     

当'内部'XmlWriter对象完成写入时   TextBlock元素,写入的文本写入   'outer'XmlWriter使用WriteRaw方法。

答案 1 :(得分:0)

您可能必须从XmlWriter继承以编码序列化规则,然后使用此自定义XmlWriter保存XDocument。

答案 2 :(得分:0)

一个令人不愉快但可能是“最不利的替代方案”是在创建元素时自己添加所需的空格。这样,当你保存时,你可以保留所有空格,这样就可以了。它确实意味着要弄清楚如何自己进行缩进(计算出你的树下有多远并添加正确的数字空格)但它不应该痛苦。