Métodos de codificação XML e interface DOM

Este artigo descreve métodos de codificação XML e interface DOM.

Versão original do produto: Linguagem de marcação extensível
Número de KB original: 275883

Resumo

Uma das principais vantagens dos dados XML (Extensible Markup Language) é que ele é uma plataforma independente. No entanto, a codificação correta deve ser especificada para garantir a transferência adequada de dados XML entre diferentes plataformas. O white paper How to Encode XML Data aborda problemas gerais de codificação XML em detalhes: Como codificar dados XML.

Na maioria dos cenários, os erros de codificação XML se originam das diferentes configurações de codificação padrão dos métodos e interfaces MSXML (analisador XML). Uma compreensão clara dessas configurações padrão ajudará a evitar os erros de codificação.

Codificações XML

O MSXML dá suporte a todas as codificações compatíveis com Explorer da Internet. O suporte do Explorer da Internet depende de quais pacotes de idiomas estão instalados no computador; essas informações são armazenadas sob a chave do registro: HKEY_CLASSES_ROOT\MIME\Database\Charset.

O MSXML tem suporte nativo para as seguintes codificações:

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

O local apropriado para especificar a codificação dos dados é a declaração XML. Por exemplo, se os dados estiverem codificados com ISO-8859-1 o padrão, você poderá especificar isso da seguinte maneira:

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

Sem essas informações, a codificação padrão é UTF-8 ou UTF-16, dependendo da presença de uma BOA (marca de byte unicode) no início do arquivo XML. Se o arquivo começar com uma marca de ordem de byte UNICODE (0xFF 0xFE) ou (0xFE 0xFF), o documento será considerado na codificação UTF-16; caso contrário, ele está em UTF-8. O método Save da IXMLDOMDocument interface mantém a codificação original do documento. O padrão para esse método é UTF-8.

Erros de DOM MSXML

Dois erros comuns que são retornados dos métodos de interface DOM (Modelo de Objeto de Documento XML) são:

  • Um caractere Inválido foi encontrado no conteúdo de texto.

  • Alternar da codificação atual para a codificação especificada não com suporte.

Com o método de carga da IXMLDOMDocument interface, esses erros geralmente ocorrem nas seguintes condições:

  • Nenhuma codificação é especificada, nenhuma marca de pedido de byte é encontrada no início do arquivo XML e os dados contêm caracteres especiais

  • A codificação especificada não corresponde à codificação real dos dados XML. Uma boa prática é sempre especificar a codificação correta dentro da declaração XML, em vez de aceitar a codificação padrão.

Com as versões do analisador MSXML 2.5, 2.5 SP1 e 2.6, o loadXML método de IXMLDOMDocument só pode carregar dados codificados UTF-16 ou UCS-2. Qualquer tentativa de carregar dados XML codificados com outro formato de codificação resulta no seguinte erro:

Alternar da codificação atual para a codificação especificada não com suporte. Com a versão do MSXML 3.0 (Msxml3.dll), essa restrição é removida e o seguinte código é executado sem erro:

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

Observação

A propriedade xml da IXMLDOMDocument interface grava os dados XML como UTF-16 codificados, mas sem a marca de ordem de byte no início. Isso pode levar a problemas de codificação.

Você também pode receber esses erros ao chamar o transformNode método da IXMLDOMNode interface com um arquivo XSL ou XSLT no qual as informações de codificação XML são especificadas da seguinte maneira:

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

O transformNode método retorna um BSTR que é dados codificados UTF-16 por definição. Uma maneira melhor de manter a codificação é chamar o transformNodeToObject método e armazenar os resultados em um fluxo ou em um novo documento XML e salvá-lo.

Referências

NamespaceSystem.Xml