将XML加载到XmlDocument中时,即
XmlDocument document = new XmlDocument(); document.LoadXml(xmlData);
有没有办法阻止流程替换实体?我有一个奇怪的问题,我在xml中有一个TM符号(存储为实体#8482)被转换为TM字符。就我而言,这不应该发生,因为XML文档具有编码ISO-8859-1(没有TM符号)
由于
答案 0 :(得分:4)
你在写什么?一个TextWriter?一条小溪?什么?
以下内容保留了实体(好吧,它用十六进制等效替换它) - 但如果你对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>
答案 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 ™]]>
</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函数,它似乎只编码一个小的必要字符的子集)