目前我正在XmlDocument中编写XHTML。这很完美,但我遇到了一个问题。某些XmlText元素可以包含& nbsp;之类的内容。当我想将这些东西写入流时,它使用innerXML而不是innerText值来表示这些节点。问题是输出是错误的,因为现在输出& amp; nbsp;而不是& nbsp;。在写入流时,如何在不执行此类转义的情况下使用xmlwriter和xmldocument?我只想要未转义的输出。
答案 0 :(得分:2)
如果你使用XmlWriter.WriteRaw
,它将不会执行任何转义 - 它假设你有原始XML。
例如:
using System;
using System.Xml;
class Test
{
static void Main()
{
using (XmlWriter writer = XmlWriter.Create(Console.Out))
{
writer.WriteStartDocument();
writer.WriteStartElement("root");
writer.WriteRaw("<element> </element>");
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
}
输出:
<?xml version="1.0" encoding="IBM437"?><root><element> </element></root>
答案 1 :(得分:2)
你几乎肯定在这里试图解决错误的问题。如果您希望文本包含不间断的空格,则应使用non-breaking space character。在C#字符串文字中,您可以将其编写为转义序列\u00A0
,例如:
var xmldoc = new XmlDocument();
XmlElement test = xmldoc.CreateElement("test");
xmldoc.AppendChild(test);
XmlText nbsp = xmldoc.CreateTextNode("\u00A0");
test.AppendChild(nbsp);
像nbsp
这样的HTML实体只是在非Unicode文本文件中对这些字符进行编码的一种方法。在构造XML DOM时,您不应该使用它们。顺便说一下,如果强制.NET将上述DOM写入ASCII编码文件(通过适当的XmlWriterSettings),那么它可能会将不间断空格字符写为 
。在UTF-8编码文件(默认)中,它只显示为空格。
如果强制某些文字字符序列出现在XML输出中,则可能会产生无法通过符合XML处理器加载的无效XML。例如,尝试在空<test>
中加载</test>
&amp; nbsp; XmlDocument
。这将抛出异常。公平地说,可以声明这样的实体,而XHTML模式也是如此。但我希望你明白我的意思。
编辑:XmlDocument正确地完成了它的工作。如果它不会逃脱诸如&amp; &LT; &GT;然后你可以创建无法再次加载的无效XML。要在输出中强制使用XML实体,您应该使用XmlDocument.CreateEntityReference。该错误出现在XmlText节点中使用实体的任何代码中,而不是生成XmlEntityReference节点。
答案 2 :(得分:1)
假设您使用的是.NET 3.x,请学习并使用LINQ-to-XML ... API非常简单且功能更强大。这样你就不需要遍历/遍历DOM了......而是可以只查询对象树。
具体来说,请查看API的XDocument clas。