将XML加载到XmlDocument中时,即

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

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

由于

有帮助吗?

解决方案

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

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

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

其他提示

你在写什么?一个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>

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

加载文档后你在做什么?

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

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

实体引用不是特定于编码的。根据 W3C XML 1.0 Recommendation

  

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

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

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

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

感谢所有帮助。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top