.NET XmlDocument LoadXML和实体

时间:2008-09-30 12:51:19

标签: c# xml entity

将XML加载到XmlDocument中时,即

XmlDocument document = new XmlDocument();
document.LoadXml(xmlData);

有没有办法阻止流程替换实体?我有一个奇怪的问题,我在xml中有一个TM符号(存储为实体#8482)被转换为TM字符。就我而言,这不应该发生,因为XML文档具有编码ISO-8859-1(没有TM符号)

由于

7 个答案:

答案 0 :(得分:4)

你在写什么?一个TextWriter?一条小溪?什么?

以下内容保留了实体(好吧,它用十六进制等效替换它) - 但如果你对StringWriter做同样的事情,它会检测到unicode并使用它:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</xml>");
    using (MemoryStream ms = new MemoryStream())
    {
        XmlWriterSettings settings = new  XmlWriterSettings();
        settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
        XmlWriter xw = XmlWriter.Create(ms, settings);
        doc.Save(xw);
        xw.Close();
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
    }

输出:

    <?xml version="1.0" encoding="iso-8859-1"?><xml>&#x2122;</xml>

答案 1 :(得分:4)

这是对XML工具集的标准误解。 “&amp; #x”的整个业务是一种语法功能,旨在应对字符编码。您的XmlDocument不是字符流 - 它已经没有字符编码问题 - 而是包含XML类型数据的抽象模型。对此的话包括DOM和InfoSet,我不确定哪个是准确的。

“&amp; #x”gubbins将不存在于此模型中,因为整个问题无关紧要,当您将信息集转换回某些特定编码的字符流时,它将返回 - 如果适用的话。 p>

这种误解足以让它成为学术文献中的一部分类似怪癖的一部分。在这个位置查看“Xml Fever”:http://doi.acm.org/10.1145/1364782.1364795

答案 2 :(得分:2)

我承认事情对XML文档和编码有点混乱,但我希望当你再次保存它时它会被设置为适当的,如果你还在使用ISO-8859-1 - 但如果你保存的话使用UTF-8,它不需要。在某些方面,逻辑上文档实际上包含符号而不是实体引用 - 后者只是一个编码问题。 (我在这里大声思考 - 请不要把它作为权威信息。)

加载文档后你在做什么?

答案 3 :(得分:0)

如果你将实体内容包含在CDATA部分中,我应该完全放弃,例如。

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>

答案 4 :(得分:0)

实体引用不是特定于编码的。根据{{​​3}}:

  

如果字符引用以。开头   “&amp; #x”,数字和字母最多   终止;提供一个   十六进制表示   ISO / IEC中字符的代码点   10646

答案 5 :(得分:0)

&amp; #xxxx;实体被认为是它们所代表的角色。在读取时将所有XML转换为unicode,并删除任何此类实体,以支持它们所代表的unicode字符。这包括在unicode源中出现的任何内容,例如传递给LoadXML的字符串。

类似地,在写入时,正在写入的流不能表示的任何字符被转换为&amp; #xxxx;实体。试图保护它们没有什么意义。

一个常见的错误是期望通过某种方式从DOM获取字符串,该方法使用除unicode之外的编码。这不管怎样都不会发生

答案 6 :(得分:0)

感谢所有帮助。

我通过编写一个HtmlEncode函数解决了我的问题,该函数在将它们吐出到网页之前实际上替换了所有字符(而不是依赖于稍微破坏的HtmlEncode().NET函数,它似乎只编码一个小的必要字符的子集)