将 XML 加载到 XmlDocument 时,即
XmlDocument 文档 = 新 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
你在写什么?一个文字作家?流?什么?
以下保留实体(嗯,它用十六进制等效替换它) - 但如果你对 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 推荐:
如果字符引用以“&#x”开头,则数字和字母直到终止;在 ISO/IEC 10646 中提供字符代码点的十六进制表示。
&#xxxx; 实体被认为是它们所代表的字符。所有 XML 在读取时都会转换为 unicode,并且任何此类实体都将被删除以支持它们所代表的 unicode 字符。这包括它们在 unicode 源中出现的任何情况,例如传递给 LoadXML 的字符串。
同样,在写入任何不能由正在写入的流表示的字符时,都将转换为 &#xxxx; 实体。试图保护它们毫无意义。
一个常见的错误是期望通过某种方式从 DOM 中获取字符串,该方式使用除 unicode 之外的编码。无论发生什么,这都不会发生
感谢所有的帮助。
我已经通过编写一个 HtmlEncode 函数解决了我的问题,该函数实际上在将所有字符吐出到网页之前替换了所有字符(而不是依赖于有点损坏的 HtmlEncode() .NET 函数,它似乎只编码了一小部分必要的字符)