2015-11-15 118 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()後,緩衝區中的「/>」被替換爲「/>」: