.NET XmlDocument LoadXML和实体

将XML加载到XmlDocument中时,即

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

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

谢谢

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

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

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

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

下面保留了实体(好吧,它用hex等效替换它) – 但如果你对StringWriter做同样的事情,它会检测到unicode并使用它代替:

XmlDocument doc = new XmlDocument(); doc.LoadXml(@""); 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文档和编码有点混乱,但是如果你还在使用ISO-8859-1,我希望你再次保存时会设置合适 – 但是如果用UTF保存的话 – 8,它不需要。 从某些方面来说,逻辑上文档确实包含符号而不是实体引用 – 后者只是一个编码问题。 (我在这里大声思考 – 请不要把它作为权威信息。)

加载文件后你在做什么?

我相信,如果你将实体内容附在CDATA部分,它应该将它全部单独留下,例如

      

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

如果字符引用以“&#x”开头,则数字和字母一直到终止; 提供ISO / IEC 10646中字符代码点的hex表示。

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

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

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

感谢您的帮助。

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