我正在编写一个接收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应用格式,即使整个文档没有这样做?
答案 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)
一个令人不愉快但可能是“最不利的替代方案”是在创建元素时自己添加所需的空格。这样,当你保存时,你可以保留所有空格,这样就可以了。它确实意味着要弄清楚如何自己进行缩进(计算出你的树下有多远并添加正确的数字空格)但它不应该太痛苦。