Поделиться через


Методы кодирования XML и интерфейса DOM

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

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

Ошибки DOM MSXML

Ниже приведены две распространенные ошибки, возвращаемые из методов интерфейса объектной модели XML-документов (DOM):

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

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

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

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

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

С помощью анализатора MSXML версий 2.5, 2.5 SP1 и 2.6 loadXML метод IXMLDOMDocument может загружать только данные в кодировке UTF-16 или UCS-2. Любая попытка загрузить XML-данные, закодированные с помощью другого формата кодирования, приводит к следующей ошибке:

Переключение с текущей кодировки на указанную кодировку не поддерживается. После выпуска MSXML 3.0 (Msxml3.dll), это ограничение удаляется, а следующий код выполняется без ошибки:

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

Примечание.

Xml-свойство IXMLDOMDocument интерфейса записывает XML-данные в кодировке UTF-16, но без метки порядка байтов в начале. Это может привести к проблемам с кодировкой.

Эти ошибки также могут возникать при вызове transformNode метода IXMLDOMNode интерфейса с XSL или XSLT-файлом, в котором указана информация о кодировке XML следующим образом:

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

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

Ссылки

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