首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlWriter插入xml:space=preserve时的空格

XmlWriter插入xml:space=preserve时的空格
EN

Stack Overflow用户
提问于 2011-08-10 07:54:52
回答 1查看 3.6K关注 0票数 5

给定此代码(C#,.NET 3.5 SP1):

代码语言:javascript
复制
var doc = new XmlDocument();
doc.LoadXml("<?xml version=\"1.0\"?><root>"
    + "<value xml:space=\"preserve\">"
    + "<item>content</item>"
    + "<item>content</item>"
    + "</value></root>");

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("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<root>\r\n"
    + "  <value xml:space=\"preserve\"><item>content</item>"
    + "<item>content</item></value>\r\n</root>", xml);

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

我试图在没有空白的输入(或者只有重要的空格,并且已经加载到XmlDocument中)并漂亮地打印它,而不会在标记为保留空白的元素中添加任何空白(出于明显的原因)。

这是个窃听器还是我做错什么了?有没有更好的方法来实现我想做的事?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-11 06:55:27

好吧,我找到解决办法了。

事实证明,如果XmlWriter实际上是xml:space="preserve"块中的任何空格,那么它做的事情是正确的--只有在没有任何空白的情况下,它才会搞砸并添加一些空格。而且方便地说,如果有一些空白节点,即使它们是空的,这也是有效的。因此,我想出的诀窍是,在尝试写出文档之前,在适当的地方用额外的0长度空格来装饰文档。结果正是我想要的:到处都是漂亮的打印,除了空格很重要的地方。

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

代码语言:javascript
复制
PreserveWhitespace(doc.DocumentElement);
doc.DocumentElement.WriteTo(writer);

..。

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

不过,我仍然认为XmlWriter的这种行为是一个bug。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7007533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档