Codificación XML y métodos de interfaz DOM

En este artículo se describen los métodos de codificación XML e interfaz DOM.

Versión original del producto: Lenguaje de marcado extensible
Número de KB original: 275883

Resumen

Una de las principales ventajas de los datos del Lenguaje de marcado extensible (XML) es que es una plataforma independiente. Sin embargo, se debe especificar la codificación correcta para garantizar la transferencia adecuada de datos XML entre distintas plataformas. Las notas del producto How to Encode XML Data abordan los problemas generales de codificación XML en detalle: Cómo codificar datos XML.

En la mayoría de los escenarios, los errores de codificación XML se originan en los diferentes valores de codificación predeterminados de los métodos e interfaces del analizador XML (MSXML). Una comprensión clara de esta configuración predeterminada ayudará a evitar los errores de codificación.

Codificaciones XML

MSXML admite todas las codificaciones compatibles con Internet Explorer. La compatibilidad de Internet Explorer depende de qué paquetes de idioma están instalados en el equipo; esta información se almacena en la clave del Registro: HKEY_CLASSES_ROOT\MIME\Database\Charset.

MSXML tiene compatibilidad nativa con las siguientes codificaciones:

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

El lugar adecuado para especificar la codificación de los datos es la declaración XML. Por ejemplo, si los datos están codificados con ISO-8859-1 estándar, puede especificarlo de la siguiente manera:

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

Sin esta información, la codificación predeterminada es UTF-8 o UTF-16, dependiendo de la presencia de una marca de orden de bytes UNICODE (BOM) al principio del archivo XML. Si el archivo comienza con una marca de orden de bytes UNICODE (0xFF 0xFE) o (0xFE 0xFF), el documento se considera que está en codificación UTF-16; De lo contrario, está en UTF-8. El método Save de la IXMLDOMDocument interfaz mantiene la codificación original del documento. El valor predeterminado de este método es UTF-8.

Errores dom de MSXML

Dos errores comunes que se devuelven desde los métodos de interfaz del modelo de objetos de documento (DOM) XML son:

  • Se encontró un carácter no válido en el contenido de texto.

  • No se admite el cambio de codificación actual a codificación especificada.

Con el método de carga de la IXMLDOMDocument interfaz, estos errores suelen producirse en las condiciones siguientes:

  • No se especifica ninguna codificación, no se encuentra ninguna marca de orden de bytes al principio del archivo XML y los datos contienen caracteres especiales.

  • La codificación especificada no coincide con la codificación real de los datos XML. Una buena práctica consiste en especificar siempre la codificación correcta dentro de la declaración XML, en lugar de aceptar la codificación predeterminada.

Con las versiones 2.5, 2.5 SP1 y 2.6 del analizador MSXML, el loadXML método de IXMLDOMDocument solo puede cargar datos codificados UTF-16 o UCS-2. Cualquier intento de cargar datos XML codificados con otro formato de codificación da como resultado el siguiente error:

No se admite el cambio de codificación actual a codificación especificada. Con la versión de MSXML 3.0 (Msxml3.dll), esta restricción se quita y el código siguiente se ejecuta sin errores:

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

Nota:

La propiedad xml de la IXMLDOMDocument interfaz escribe los datos XML como utf-16 codificados, pero sin la marca de orden de bytes al principio. Esto puede dar lugar a problemas de codificación.

También puede recibir estos errores al llamar al transformNode método de la IXMLDOMNode interfaz con un archivo XSL o XSLT en el que se especifica la información de codificación XML de la siguiente manera:

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

El transformNode método devuelve un BSTR que es datos codificados con UTF-16 por definición. Una mejor manera de conservar la codificación es llamar al transformNodeToObject método y almacenar los resultados en una secuencia o en un nuevo documento XML y, a continuación, guardarlo.

Referencias

espacio de nombresSystem.Xml