删除不需要的属性后,xml格式更改。

时间:2015-07-09 15:25:09

标签: c# xml streamreader xmldocument xml-formatting

我正在使用这样的技术将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原始格式的任何想法?

2 个答案:

答案 0 :(得分:0)

<强>空白

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

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

var xmlDocument = new XmlDocument
{
    PreserveWhitespace = true
};

<强>行情

您的第二个问题与引号字符有关。单或双有效,但.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);

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

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

答案 1 :(得分:0)

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

根据您的情况,我建议尝试使用其他xml实现。对于我们的情况,由于我们不需要改变某些,我们首先单独保留所有字符串,然后解析文档的副本以从中提取信息。完成后把它扔到垃圾桶里。

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