XmlDocument没有保留空格

时间:2015-11-15 17:27:16

标签: c# .net xmldocument

XmlDocument在自结算标记的末尾添加了一个空格,即使PreserveWhitespace设置为true也是如此。

// This fails
string originalXml = "<sample><node id=\"99\"/></sample>";

// Convert to XML
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.LoadXml(originalXml);

// Save back to a string
string extractedXml = null;

using (MemoryStream stream = new MemoryStream())
{
    doc.Save(stream);

    stream.Position = 0;
    using(StreamReader reader = new StreamReader(stream))
    {
        extractedXml = reader.ReadToEnd();
    }
}

// Confirm that they are identical
Assert.AreEqual(originalXml, extractedXml);

所需的输出是:

<sample><node id="99"/></sample>

但我得到了:

<sample><node id="99" /></sample>

有没有办法压制额外的空间?

1 个答案:

答案 0 :(得分:1)

以下是XmlDocument.Save(Stream)的样子:

public virtual void Save(Stream outStream)
{
  XmlDOMTextWriter xmlDomTextWriter = new XmlDOMTextWriter(outStream, this.TextEncoding);
  if (!this.preserveWhitespace)
    xmlDomTextWriter.Formatting = Formatting.Indented;
  this.WriteTo((XmlWriter) xmlDomTextWriter);
  xmlDomTextWriter.Flush();
}

因此设置PreserveWhiteSpace对节点内部没有影响。 XmlTextWriter的{​​{3}}说:

  

例如,在编写空元素时,会在标记名称和结束标记之间添加额外的空格。这提供了与旧版浏览器的兼容性。

所以我猜没有简单的方法。 documentation是一个解决方法:

  

所以我写了一个包装类MtxXmlWriter,它派生自XmlWriter并包装XmlWriter.Create()返回的原始XmlWriter,并完成所有必要的技巧。

     

您只需调用其中一个MtxXmlWriter.Create()方法,而不是使用XmlWriter.Create()。除WriteEndElement()之外,所有其他方法都直接移交给封装的原始XmlWriter。在调用封装的XmlWriter的WriteEndElement()之后,“/&gt;”替换为“/&gt;”在缓冲区中: