INFO: Codificación XML y métodos de la interfaz de DOM

Resumen

Una ventaja importante de los datos de lenguaje de marcado Extensible (XML, Extensible Markup Language) es que es independiente de la plataforma. Sin embargo, la codificación correcta debe especificarse para asegurar a la transferencia correcta de datos XML entre distintas plataformas. Las notas del producto "Cómo codificar datos de XML" soluciona problemas de codificación de XML generales en detalle:
En la mayoría de los casos, los errores de codificación XML proceden de la predeterminada diferente configuración de las interfaces y métodos de Microsoft XML parser (MSXML) de codificación. Una comprensión clara de estos valores predeterminados le ayudará a evitar los errores de codificación.

Más información

Codificaciones XML

MSXML admite todas las codificaciones admitidas por Microsoft Internet Explorer. Compatibilidad de Internet Explorer depende de qué paquetes de idioma están instalados en el equipo; Esta información se almacena en la siguiente clave del registro:
HKEY_CLASSES_ROOT\MIME\Database\Charset
MSXML tiene compatibilidad nativa con las codificaciones siguientes:
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
También reconoce (internamente utilizando la función de API WideCharToMultibyte para asignaciones) las codificaciones siguientes:
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 se codifican con el estándar ISO-8859-1, puede especificarlo como sigue:
<?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 en codificación UTF-16; de lo contrario, es en UTF-8. El método Save de la interfaz IXMLDOMDocument mantiene la codificación original del documento. El valor predeterminado de este método es UTF-8.

Errores MSXML DOM

Dos errores comunes que se devuelven desde los métodos de interfaz XML Document Object Model (DOM) son:
Se encontró un carácter no válido en el contenido de texto.
- y -
No admite el conmutador de la actual codificación a una codificación especificada.
Con el método load de la interfaz IXMLDOMDocument , estos errores se producen normalmente en las siguientes condiciones:
  • No se especifica ninguna codificación, se detecta 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 es especificar siempre la codificación correcta dentro de la declaración XML, en lugar de aceptar la codificación predeterminada.

Con el analizador MSXML sólo pueden cargar versiones 2.5, 2.5 SP1 y 2.6, el método loadXML de IXMLDOMDocument UTF-16 o datos codificados en UCS-2. Cualquier intento de cargar los datos XML que está codificados con otra codificación formato da como resultado el siguiente error:
No admite el conmutador de la actual codificación a una codificación especificada.
Con el lanzamiento de MSXML 3.0 (Msxml3.dll), esta restricción se elimina y el siguiente código se ejecuta sin errores:
hr = pXMLDoc->loadXML("<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag1>Abcdef</tag1>");
NOTA: la propiedad xml de la interfaz IXMLDOMDocument escribe los datos XML como UTF-16 codificados, pero sin la marca de orden de bytes al principio. Esto puede conducir a problemas de codificación.

También puede recibir estos errores cuando se llama al método transformNode de la interfaz IXMLDOMNode con un archivo XSL o XSLT en la que la información de codificación XML se especifica como sigue:
<xsl:output method="xml" encoding="UTF-8" />
El método transformNode devuelve un BSTR que son datos de UTF-16 codificados por definición. Una mejor manera de conservar la codificación es llamar a la
almacén y método transformNodeToObject los resultados en una secuencia o en un nuevo XML del documento y, a continuación, guárdelo.

Referencias

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

259555 PRB: Error se produce cuando se abre un objeto Recordset de ADO en la secuencia XML
Para la información y descarga XML más reciente, consulte el siguiente sitio Web de Microsoft Developer Network (MSDN):
Propiedades

Id. de artículo: 275883 - Última revisión: 9 ene. 2017 - Revisión: 1

Comentarios