4

将 XML 加载到 XmlDocument 时,即

XmlDocument 文档 = 新 XmlDocument();
document.LoadXml(xmlData);

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

谢谢

4

7 回答 7

4

这是对 XML 工具集的标准误解。整个业务带有“&#x”,是一种旨在应对字符编码的句法特征。您的 XmlDocument 不是字符流 - 它已经摆脱了字符编码问题 - 相反,它包含 XML 类型数据的抽象模型。这方面的词包括 DOM 和 InfoSet,我不确定哪个是准确的。

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

这种误解非常普遍,以至于将其作为类似怪癖集合的一部分纳入学术文献。看看这个位置的“Xml Fever”:http: //doi.acm.org/10.1145/1364782.1364795

于 2008-09-30T13:26:22.300 回答
3

你在写什么?一个文字作家?流?什么?

以下保留实体(嗯,它用十六进制等效替换它) - 但如果你对 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>
于 2008-09-30T13:01:28.243 回答
2

我承认 XML 文档和编码有点令人困惑,但我希望当你再次保存它时它会被设置为适当的,如果你仍然使用 ISO-8859-1 - 但是如果你用 UTF-保存8、没必要。在某些方面,从逻辑上讲,文档确实包含符号而不是实体引用——后者只是一个编码问题。(我在这里大声思考-请不要将此作为权威信息。)

加载文件后你在做什么?

于 2008-09-30T12:59:42.647 回答
0

我相信如果您将实体内容包含在 CDATA 部分中,它应该不理会它,例如

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>
于 2008-09-30T13:01:21.520 回答
0

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

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

于 2008-09-30T13:11:36.627 回答
0

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

同样,在写入任何不能由正在写入的流表示的字符时,都将转换为 &#xxxx; 实体。试图保护它们毫无意义。

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

于 2008-09-30T13:28:52.140 回答
0

感谢所有的帮助。

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

于 2008-09-30T16:18:28.037 回答