【发布时间】:2008-09-30 12:51:19
【问题描述】:
将 XML 加载到 XmlDocument 中时,即
XmlDocument 文档 = 新 XmlDocument(); document.LoadXml(xmlData);有没有办法阻止进程替换实体?我有一个奇怪的问题,我在 xml 中有一个 TM 符号(存储为实体 #8482)被转换为 TM 字符。就我而言,这不应该发生,因为 XML 文档具有编码 ISO-8859-1(没有 TM 符号)
谢谢
【问题讨论】:
将 XML 加载到 XmlDocument 中时,即
XmlDocument 文档 = 新 XmlDocument(); document.LoadXml(xmlData);有没有办法阻止进程替换实体?我有一个奇怪的问题,我在 xml 中有一个 TM 符号(存储为实体 #8482)被转换为 TM 字符。就我而言,这不应该发生,因为 XML 文档具有编码 ISO-8859-1(没有 TM 符号)
谢谢
【问题讨论】:
这是对 XML 工具集的标准误解。整个业务带有“”,是一种旨在应对字符编码的句法特征。您的 XmlDocument 不是字符流——它已经摆脱了字符编码问题——而是包含 XML 类型数据的抽象模型。这方面的词包括 DOM 和 InfoSet,我不确定哪个是准确的。
"" gubbins 在此模型中将不存在,因为整个问题无关紧要,如果合适的话,当您将信息集转换回某种特定编码的字符流时,它将返回。
这种误解非常普遍,以至于将其作为类似怪癖集合的一部分写入学术文献。看看这个位置的“Xml Fever”:http://doi.acm.org/10.1145/1364782.1364795
【讨论】:
你在写什么?一个文字作家?流?什么?
以下内容保留实体(好吧,它用十六进制等效项替换它) - 但如果您对 StringWriter 执行相同操作,它会检测到 unicode 并改用它:
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<xml>™</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>™</xml>
【讨论】:
我承认 XML 文档和编码有点令人困惑,但我希望当你再次保存它时它会被设置为适当的,如果你仍在使用 ISO-8859-1 - 但是如果你保存使用 UTF-8,就不需要了。在某些方面,从逻辑上讲,文档确实包含符号而不是实体引用——后者只是一个编码问题。 (我在这里大声思考-请不要将此作为权威信息。)
文件加载后你在做什么?
【讨论】:
我相信如果您将实体内容包含在 CDATA 部分中,它应该不理会它,例如
<root>
<testnode>
<![CDATA[some text ™]]>
</testnode>
</root>
【讨论】:
实体引用不是特定于编码的。根据W3C XML 1.0 Recommendation:
如果字符引用以 "",数字和字母最多 终止;提供一个 的十六进制表示 ISO/IEC 中字符的代码点 10646.
【讨论】:
xxx;实体被认为是它们所代表的字符。所有 XML 在读取时都会转换为 unicode,并且任何此类实体都将被删除以支持它们所代表的 unicode 字符。这包括它们在 unicode 源中出现的任何情况,例如传递给 LoadXML 的字符串。
类似地,在写入任何不能由正在写入的流表示的字符时,将转换为 xxx;实体。试图保护它们毫无意义。
一个常见的错误是期望通过某种方式从 DOM 中获取字符串,该方式使用除 unicode 之外的编码。无论发生什么,这都不会发生
【讨论】:
感谢大家的帮助。
我已经通过编写一个 HtmlEncode 函数解决了我的问题,该函数实际上会在将所有字符吐出到网页之前替换所有字符(而不是依赖似乎只编码一小部分的有点损坏的 HtmlEncode() .NET 函数必要字符的子集)
【讨论】: