如何使用XDocument保留所有XML格式?

9

我正在尝试读取一个XML配置文件,对其进行一些微调(查找、删除或添加元素),然后再保存。我希望这个编辑尽可能地不会对原有配置文件造成影响,因为该文件将被纳入源代码控制中,我不想毫无意义的更改导致合并冲突等问题。以下是大致代码:

XDocument configDoc = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);
// modifications to configDoc here
configDoc.Save(fileName, SaveOptions.DisableFormatting);

这里有几个问题需要解决:
  1. encoding="utf-8"会被添加到xml声明中。
  2. <tag attr="val"/>会变成<tag attr="val" />
  3. 为了易读性而将属性分散在不同行的,现在都将被推到一行。
能否用XDocument实现更小干扰地处理呢?还是只能对字符串进行编辑以达到目的?
2个回答

5
LINQ to XML对象模型不会存储所解析的元素是标记为<foo/>还是<foo />,因此,当保存时这些信息会丢失。如果您想确保某种格式,则可以扩展一个XmlWriter实现并覆盖其http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeendelement.aspx,但是这样做也不会保留输入格式,而是将任何空元素写出为<foo/>或您在方法中实现的任何其他格式。
还有其他可能发生的更改,例如在加载文件时。
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Example</h1>
  </body>
</html>

并将结果保存回去,结果如下:
<xhtml:html xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <xhtml:head>
    <xhtml:title>Example</xhtml:title>
  </xhtml:head>
  <xhtml:body>
    <xhtml:h1>Example</xhtml:h1>
  </xhtml:body>
</xhtml:html>

因此,当使用XDocument / XElement加载/保存时,请不要期望保留标记详细信息。

3
我猜简短的回答是“你不能”。:( - RandomEngy

1
为了避免在文档头部声明,您可以使用以下方法。
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;


        using (XmlWriter xw = XmlWriter.Create(fileName, settings))
        {
            doc.Save(xw);
        }

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