XML 编码和 DOM 接口方法

本文介绍 XML 编码和 DOM 接口方法。

原始产品版本: 可扩展标记语言
原始 KB 数: 275883

总结

可扩展标记语言(XML)数据的一个主要优点是它是一个独立的平台。 但是,必须指定正确的编码,以确保在不同平台之间正确传输 XML 数据。 白皮书 如何对 XML 数据 进行编码,详细介绍了一般 XML 编码问题: 如何对 XML 数据进行编码。

在大多数情况下,XML 编码错误源自 XML 分析程序(MSXML)方法和接口的不同默认编码设置。 清楚地了解这些默认设置将有助于防止编码错误。

XML 编码

MSXML 支持 Internet Explorer 支持的所有编码。 Internet Explorer 的支持取决于计算机上安装的语言包;此信息存储在注册表项下: HKEY_CLASSES_ROOT\MIME\Database\Charset

MSXML 对以下编码具有本机支持:

UTF-8
UTF-16
UCS-2
UCS-4
ISO-10646-UCS-2
UNICODE-1-1-UTF-8
UNICODE-2-0-UTF-16
UNICODE-2-0-UTF-8
It also recognizes (internally using the WideCharToMultibyte API function for mappings) the following encodings:
US-ASCII
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
WINDOWS-1250
WINDOWS-1251
WINDOWS-1252
WINDOWS-1253
WINDOWS-1254
WINDOWS-1255
WINDOWS-1256
WINDOWS-1257
WINDOWS-1258

为数据指定编码的正确位置是 XML 声明。 例如,如果数据使用 ISO-8859-1 标准编码,则可以按如下所示指定此数据:

<?xml version="1.0" encoding="ISO-8859-1"?>

如果没有此信息,默认编码为 UTF-8 或 UTF-16,具体取决于 XML 文件的开头是否存在 UNICODE 字节顺序标记(BOM)。 如果文件以 UNICODE 字节顺序标记(0xFF 0xFE)或(0xFE 0xFF)开头,则文档被视为采用 UTF-16 编码;否则,它位于 UTF-8 中。 接口的 IXMLDOMDocument Save 方法维护文档的原始编码。 此方法的默认值为 UTF-8。

MSXML DOM 错误

XML 文档对象模型 (DOM) 接口方法返回的两个常见错误包括:

  • 文本内容中找到了无效字符。

  • 不支持从当前编码切换到指定的编码。

使用接口的 IXMLDOMDocument 加载方法时,这些错误通常发生在以下情况下:

  • 未指定编码,在 XML 文件的开头找不到字节顺序标记,并且数据包含特殊字符

  • 指定的编码与 XML 数据的实际编码不匹配。 最佳做法是始终在 XML 声明中指定正确的编码,而不是接受默认编码。

使用 MSXML 分析器版本 2.5、2.5 SP1 和 2.6,该方法loadXMLIXMLDOMDocument只能加载 UTF-16 或 UCS-2 编码的数据。 任何尝试加载使用另一种编码格式编码的 XML 数据都会导致以下错误:

不支持从当前编码切换到指定的编码。 随着 MSXML 3.0(Msxml3.dll)的发布,将删除此限制,并且以下代码运行时不会出现错误:

hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");

注意

接口的 IXMLDOMDocument xml 属性将 XML 数据写出为 UTF-16 编码,但在开头没有字节顺序标记。 这可能会导致编码问题。

调用 transformNode 接口的 IXMLDOMNode 方法并使用 XML 编码信息如下指定的 XSL 或 XSLT 文件时,您可能会收到这些错误:

<xsl:output method="xml" encoding="UTF-8" />

根据定义,该transformNode方法返回一个UTF-16编码的BSTR数据。 保留编码的更好方法是调用 transformNodeToObject 该方法并将结果存储到流或新的 XML 文档,然后保存。

参考

System.Xml 命名空间