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

本文关键字:XML 格式 保留 何使用 XDocument | 更新日期: 2023-09-27 18:17:57

我试图在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的侵入性,或者我必须尝试做字符串编辑来得到我想要的?

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

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加载/保存时保留标记细节。

要避免在文档的头部声明,可以使用下面的

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;

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