2015-11-15 82 views
0

XmlDocument在自闭标记的末尾添加空格,即使PreserveWhitespace设置为trueXmlDocument不保留空白

// 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> 

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

+5

出于好奇,为什么它很重要?该文件在结构上都是相同的。 –

+1

.Save在内部使用XmlTextWriter,并且该额外空间被记录为行为 –

+2

您可以使用[XNode.DeepEquals](https://msdn.microsoft.com/en-us/library/bb336169%28v=vs.110%29。 aspx)方法来比较XML。另见[this](http://blogs.msdn.com/b/ericwhite/archive/2009/01/28/equality-semantics-of-linq-to-xml-trees.aspx)文章。 –

回答

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对节点的内部没有任何效果。所述XmlTextWriterdocumentation表示:

当写一个空元素,额外的空间被标签名称和结束标记之间,例如加入。这提供了与旧版浏览器的兼容性。

所以我想没有简单的出路。 Here的一种变通方法寿:

所以我写了从XmlWriter的衍生和包装()的返回XmlWriter.Create原来的XmlWriter和做所有必要的技巧的包装类MtxXmlWriter。

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