【问题标题】:xml formatting change after removing unwanted attributes.删除不需要的属性后,xml 格式会发生变化。
【发布时间】:2015-07-09 15:25:09
【问题描述】:

我正在使用这样的技术将 Xml 文件的目录中读取到 XmlDocument 对象。

private static void StripAttributes(string filePath)
    {
        Contract.Requires(filePath != null);
        var xmlDocument = new XmlDocument();
        var encode = Encoding.GetEncoding("ISO-8859-1");
        using (var sr = new StreamReader(filePath, encode))
        {
            xmlDocument.Load(sr);
        }

这可行,但是在文本编辑器中渲染输出的 Xml 时,属性周围的单引号现在是双引号,并且子节点位于不同的行上。

之前的例子:

<xml>
  <xml2>
     <xmlField id='foo' string='bar'><xmlValue>foobar</xmlValue></xmlField>
  </xml2>
</xml>

格式化后的例子:

<xml>
  <xml2>
     <xmlField id="foo">
        <xmlValue>foobar</xmlValue>
     </xmlField>
  </xml2>
</xml>

出于比较目的,我需要原始格式保持不变。

关于如何保留 Xml 的原始格式的任何想法?

【问题讨论】:

    标签: c# xml streamreader xmldocument xml-formatting


    【解决方案1】:

    空格

    您的第一个问题是空格。在 XML 中,这通常并不重要,因此默认情况下,XmlDocument 将规范化任何重要的空白,这就是您在此处看到的。

    要更改此行为,请在加载 XML 之前设置 PreserveWhitespace = true

    var xmlDocument = new XmlDocument
    {
        PreserveWhitespace = true
    };
    

    行情

    您的第二个问题与引号字符有关。 Single 或 double 有效,但 .NET 中的默认值是 double。两个 DOM 都将在内部使用 XmlWriter 重写您的 XML,它使用此默认值。当然,您可以指定自己的 XmlWriter 实例。

    指导是使用XmlWriter.Create 工厂方法并使用XmlWriterSettings 指定任何功能,但是这在这种情况下不起作用。您必须显式创建XmlTextWriter 的实例并更改QuoteChar

    var writer = new XmlTextWriter(fileName, encoding)
    {
        QuoteChar = '\''
    };
    
    using (writer)
    {
        xmlDocument.WriteTo(writer);
    }
    

    LINQ to XML

    顺便说一句,我强烈建议您使用 LINQ to XML 而不是旧的XmlDocument API。要在XDocument 中获得类似的行为,您可以像这样解析和编写:

    var doc = XDocument.Load(filePath, LoadOptions.PreserveWhitespace);
    doc.WriteTo(writer);
    

    如果正如您的代码所建议的那样,您要删除属性,那么这样简单的代码将从名称为 xmlField 的元素中删除名称为 string 的所有属性:

    doc.Descendants("xmlField")
        .SelectMany(e => e.Attributes("string"))
        .Remove();
    

    【讨论】:

    • 谢谢,这回答了我的问题。 XmlWriter 将与 StreamReader 一起使用,还是我需要替换 StreamReader?
    • StreamReader 用于阅读XmlWriter 用于写作。您尚未展示如何编写生成的 XML,但如果您想将引号保持为单引号,则需要使用它。
    • 将“xmlDocument.Save(filePath);”工作还是需要修改保存/写入 Xml 的方式?
    • 不,您需要使用xmlDocument.WriteTo(writer) - 这是答案。
    【解决方案2】:

    可能你不能!使用 Microsoft.Net 实现 xml 渲染,渲染器总是重新格式化输出。具有任何类型设置的 XmlDocument 或 XDocument。在我的一个项目(土耳其的 Efatura)中,xml 文件是 xades 签名的,不应更改。我们已经意识到,仅渲染和保存而不进行任何更改会更改 xml 文件中的某些内容并使签名无效。此外,例如,如果输入 xml 只有一行(没有任何空格),则解析器(全部)无法解析文档。我们观察到的效果是解析器错过了一些表现得好像它们不存在的元素。

    对于您的情况,我建议尝试使用其他 xml 实现。对于我们的案例,由于我们不需要更改某事,我们首先单独保留所有字符串,然后解析文档的副本以从中提取信息。完成后扔进垃圾箱。

    对于单行 xml,我们使用了 XmlReader,但改变了匹配机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2016-11-12
      • 1970-01-01
      • 2014-10-23
      • 2015-01-25
      相关资源
      最近更新 更多