gpt4 book ai didi

c# - XmlWriter 在 xml :space=preserve 时插入空格

转载 作者:数据小太阳 更新时间:2023-10-29 02:07:02 27 4
gpt4 key购买 nike

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

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 中)并漂亮地打印它没有在标记为保留空格的元素内添加任何空格(出于显而易见的原因)。

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

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

最佳答案

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

事实证明,如果 xml:space="preserve" block 中确实有 任何空格,则 XmlWriter 会做正确的事情 - - 只有当没有任何东西时,它才会搞砸并添加一些。方便的是,如果有一些空白节点,即使它们是空的,这也有效。所以我想出的技巧是在尝试写出文档之前,在适当的地方用额外的 0 长度空白装饰文档。结果正是我想要的:除了重要的空格外,到处都打印得很好。

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

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<XmlElement>())
{
if (element.HasChildNodes && !(element.FirstChild is XmlSignificantWhitespace))
{
var whitespace = element.OwnerDocument.CreateSignificantWhitespace("");
element.InsertBefore(whitespace, element.FirstChild);
}
}
}

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

关于c# - XmlWriter 在 xml :space=preserve 时插入空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7007533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com