【问题标题】:How do I preserve all XML formatting with XDocument?如何使用 XDocument 保留所有 XML 格式?
【发布时间】:2011-12-14 21:44: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 的干扰,还是我必须尝试进行字符串编辑才能得到我想要的?

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

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

    【讨论】:

    • 所以我想简短的回答是“你不能”。 :(
    【解决方案2】:

    要避免在文档标题中声明,您可以使用以下

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多