XDocument保存时如何保留标签内的空格?

9

我正在使用LINQ中的XDocument来编辑(插入)和保存XML文档。

XDocument doc = XDocument.Load("c:\\sample.xml", LoadOptions.PreserveWhitespace);
doc.Save("c:\\sample.xml",SaveOptions.DisableFormatting)

在 doc.Save 前的 sample.xml 文件:

<ELEMENT ATTRIB1="attrib1"  ATTRIB2="attrib2" >
    value
</ELEMENT>

使用doc.Save保存后的sample.xml

<ELEMENT ATTRIB1="attrib1" ATTRIB2="attrib2">
    value
</ELEMENT>

如您所见,原始文档中ATTRIB1后面有双空格,而ATTRIB2后面只有单个空格。但是当我调用doc.save时,linq已经将这些空格去除了。

我该如何保留标签内的空格?


8
那是要求。 - Rocky
2个回答

16

我认为LoadOptions.PreserveWhitespaceSaveOptions.DisableFormatting只是告诉XDocument如何处理空格,包括缩进和文本节点的内容。它仍会规范化属性等。

你可能需要使用重载函数,指定一个已配置好你需要的XmlWriter,如果无法找到适合默认XmlTextWriter的配置,则可以创建自己的XmlWriter。


1

这些是“不重要的空格”,在读取XML时会被删除。当您调用保存时,关于属性之间的间距没有任何信息。(请注意,严格来说,属性顺序甚至可能未知,因为它在XML中没有意义)。

如果您想以不直接受XML标准支持的方式读/写XML,则需要提供一些自定义处理。根据要求,自定义XmlWriter可能足够(即,如果您想使用2个空格统一分隔属性),或者如果您想实际保留原始XML中的信息(将其视为文本而不是XML),则需要构建整个堆栈(读取器/编写器/节点)。


这似乎不正确。我认为它是在保存期间重新格式化的,而不是在读取期间。即使那是真的,文档也是在撒谎;你会注意到LoadOptions.PreserveWhitespace的文档中写着“解析时保留无关紧要的空格。”,而SaveOptions.DisableFormatting的文档中写着“序列化时保留所有无关紧要的空格。”。 - BrainSlugs83
此外,关于此XML不受标准支持的评论是不恰当的。如果它不受标准支持,它将不是有效的XML,并且在解析时会抛出异常。 - BrainSlugs83
@BrainSlugs83 - 请注意,从 XML 的角度来看,有意义/无意义的空格只被认为存在于元素内容内部(而不是在属性所在的开始标记中) - 因此,2个属性之间的空格并不被认为是 "空格",而只是属性语法分隔符。所以我不确定您为什么认为 PreserveWhitespace 应该对如何处理属性之间的空格产生影响。请查看http://www.w3.org/TR/2000/REC-xml-20001006#sec-white-space获取更详细的定义。 - Alexei Levenkov
@BrainSlugs83,我不知道我在哪里说“这个XML不被标准支持”...有一句话是关于“以一种标准直接不支持的方式编写XML...”(标准本质上允许人们按照自己想要的方式编写属性,只要属性在开始标记内并由一些空格字符分隔),但我认为你不应该把它理解为“编写不受标准支持的XML”。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接