XmlDocument未保留空白

本文关键字:空白 保留 XmlDocument | 更新日期: 2023-09-27 18:21:56

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>

有没有办法抑制多余的空间?

XmlDocument未保留空白

以下是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的文件上写着:

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

所以我想没有简单的出路。这里有一个变通方法tho:

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

您只需调用MtxXmlWriter.Create()方法之一,而不用使用XmlWriter.Create.()。除了WriteEndElement()之外,所有其他方法都直接移交给封装的原始XmlWriter。在调用封装的XmlWriter的WriteEndElement()之后/>quot;用"/>quot;在缓冲区中: