当xml:space = preserve时,XmlWriter插入空格

鉴于此代码(C#,.NET 3.5 SP1):

var doc = new XmlDocument(); doc.LoadXml("" + "" + "content" + "content" + ""); var text = new StringWriter(); var settings = new XmlWriterSettings() { Indent = true, CloseOutput = true }; using (var writer = XmlWriter.Create(text, settings)) { doc.DocumentElement.WriteTo(writer); } var xml = text.GetStringBuilder().ToString(); Assert.AreEqual("\r\n\r\n" + " content" + "content\r\n", xml); 

断言失败是因为XmlWriter元素周围插入换行符并缩进,这似乎与xml:space="preserve"属性相矛盾。

我试图在没有空格的情况下输入(或者只有很大的空白,并且已经加载到XmlDocument )并且在添加任何标记的元素内部空格的情况下进行漂亮的打印以保留空白(出于显而易见的原因)。

这是一个错误还是我做错了什么? 有没有更好的方法来实现我想要做的事情?

编辑 :我应该补充一点,我必须在输出端使用带有Indent=trueXmlWriter 。 在“真实”代码中,这是从我的代码外部传递的。

好的,我找到了一个解决方法。

事实certificate,如果在xml:space="preserve"块中实际存在任何空格, XmlWriter做正确的事情 – 只有在没有任何空格的情况下才会搞错并添加一些空格。 并且方便地,如果存在一些空白节点,即使它们是空的,这也可以工作。 所以我提出的技巧是在尝试写出文档之前,在适当的位置用额外的0长度空格来装饰文档。 结果正是我想要的:除了空白很重要之外,所有地方都可以打印。

解决方法是将内部块更改为:

 PreserveWhitespace(doc.DocumentElement); doc.DocumentElement.WriteTo(writer); 

 private static void PreserveWhitespace(XmlElement root) { var nsmgr = new XmlNamespaceManager(root.OwnerDocument.NameTable); foreach (var element in root.SelectNodes("//*[@xml:space='preserve']", nsmgr) .OfType()) { if (element.HasChildNodes && !(element.FirstChild is XmlSignificantWhitespace)) { var whitespace = element.OwnerDocument.CreateSignificantWhitespace(""); element.InsertBefore(whitespace, element.FirstChild); } } } 

我仍然认为XmlWriter这种行为是一个错误。