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。但是,这会强制我添加到文档中的所有 XElement 取消任何格式。有没有一种方法可以强制特定的 XElement 应用格式,即使整个文档都没有这样做?

4

3 回答 3

1

看起来像是您想要的答案。

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

递归函数最初使用“外部”XmlWriter,编写缩进的 XML,直到它看到 TextBlock 元素。当它遇到 TextBlock 元素时,它会创建“内部”XmlWriter 对象,并将 TextBlock 元素的子元素写入它。它还将空白写入“内部”XmlWriter。

当“内部”XmlWriter 对象完成对 TextBlock 元素的写入时,写入器写入的文本将使用 WriteRaw 方法写入“外部”XmlWriter。

于 2012-11-14T07:21:30.137 回答
0

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

于 2012-11-14T06:59:05.457 回答
0

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

于 2012-11-14T07:13:14.157 回答