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>
有没有办法压制额外的空间?
答案 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;”在缓冲区中: