编写XML文档未转义为C#

时间:2009-09-09 22:05:54

标签: c# xml xhtml

目前我正在XmlDocument中编写XHTML。这很完美,但我遇到了一个问题。某些XmlText元素可以包含& nbsp;之类的内容。当我想将这些东西写入流时,它使用innerXML而不是innerText值来表示这些节点。问题是输出是错误的,因为现在输出& amp; nbsp;而不是& nbsp;。在写入流时,如何在不执行此类转义的情况下使用xmlwriter和xmldocument?我只想要未转义的输出。

3 个答案:

答案 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>&nbsp;</element>");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
    }
}

输出:

<?xml version="1.0" encoding="IBM437"?><root><element>&nbsp;</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),那么它可能会将不间断空格字符写为&#xA0;。在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。