Кодирование XML и методы интерфейса DOM

В этой статье описывается кодирование XML и методы интерфейса DOM.

Исходная версия продукта: Расширяемый язык разметки
Исходный номер базы знаний: 275883

Сводка

Одним из основных преимуществ данных XML является то, что они являются независимой платформой. Однако необходимо указать правильную кодировку, чтобы обеспечить правильную передачу XML-данных между разными платформами. В техническом документе How to Encode XML Data (Кодирование XML-данных) подробно рассматриваются общие проблемы с кодировкой XML: Кодирование XML-данных.

В большинстве сценариев ошибки кодирования XML возникают из различных параметров кодирования по умолчанию методов и интерфейсов средства синтаксического анализа XML (MSXML). Четкое понимание этих параметров по умолчанию поможет предотвратить ошибки кодирования.

Кодировки XML

MSXML поддерживает все кодировки, поддерживаемые интернет-Обозреватель. Поддержка интернет-Обозреватель зависит от того, какие языковые пакеты установлены на компьютере. Эти сведения хранятся в разделе реестра: 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 в зависимости от наличия метки порядка байтов ЮНИКОДа (BOM) в начале XML-файла. Если файл начинается с метки порядка байтов ЮНИКОДа (0xFF 0xFE) или (0xFE 0xFF), документ считается в кодировке UTF-16; В противном случае он находится в UTF-8. Метод IXMLDOMDocument Save интерфейса поддерживает исходную кодировку документа. По умолчанию для этого метода используется UTF-8.

Ошибки модели DOM MSXML

Две распространенные ошибки, возвращаемые методами интерфейса модели DOM:

  • В текстовом содержимом найден недопустимый символ.

  • Переключение с текущей кодировки на указанную кодировку не поддерживается.

При использовании метода IXMLDOMDocument загрузки интерфейса эти ошибки обычно возникают при следующих условиях:

  • Кодировка не указана, метка порядка байтов не найдена в начале XML-файла, а данные содержат специальные символы.

  • Указанная кодировка не соответствует фактической кодировке XML-данных. Рекомендуется всегда указывать правильную кодировку внутри xml-объявления, а не принимать кодировку по умолчанию.

При использовании средства синтаксического анализа MSXML версий 2.5, 2.5 с пакетом loadXML обновления 1 (SP1) и 2.6 метод IXMLDOMDocument может загружать только данные в кодировке 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 интерфейса с XSL-файлом или XSLT, в котором указана информация о кодировке XML следующим образом:

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

Метод transformNode возвращает BSTR, который по определению является данными в кодировке UTF-16. Лучший способ сохранить кодировку — вызвать transformNodeToObject метод и сохранить результаты в потоке или в новом XML-документе, а затем сохранить его.

Ссылки

пространство именSystem.Xml