Partager via


Méthodes d’encodage XML et d’interface DOM

Cet article décrit les méthodes d’encodage XML et d’interface DOM.

Version du produit d’origine : Extensible Markup Language
Numéro de base de connaissances d’origine : 275883

Résumé

L’un des principaux avantages des données XML (Extensible Markup Language) est qu’il s’agit d’une plateforme indépendante. Toutefois, un encodage correct doit être spécifié pour garantir le transfert approprié de données XML entre différentes plateformes. Le livre blanc How to Encode XML Data traite en détail des problèmes d’encodage XML généraux : Comment encoder des données XML.

Dans la plupart des scénarios, les erreurs d’encodage XML proviennent des différents paramètres d’encodage par défaut des méthodes et interfaces de l’analyseur XML (MSXML). Une compréhension claire de ces paramètres par défaut permet d’empêcher les erreurs d’encodage.

Encodages XML

MSXML prend en charge tous les encodages pris en charge par Internet Explorer. La prise en charge d’Internet Explorer dépend des modules linguistiques installés sur l’ordinateur ; ces informations sont stockées sous la clé de Registre : HKEY_CLASSES_ROOT\MIME\Database\Charset.

MSXML prend en charge nativement les encodages suivants :

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

L’emplacement approprié pour spécifier l’encodage des données est la déclaration XML. Par exemple, si les données sont encodées avec ISO-8859-1 la norme, vous pouvez spécifier ceci comme suit :

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

Sans ces informations, l’encodage par défaut est UTF-8 ou UTF-16, selon la présence d’une marque d’ordre d’octet UNICODE (BOM) au début du fichier XML. Si le fichier commence par une marque d’ordre d’octet UNICODE (0xFF 0xFE) ou (0xFE 0xFF), le document est considéré comme en encodage UTF-16 ; sinon, c’est en UTF-8. La méthode Save de l’interface IXMLDOMDocument gère l’encodage d’origine du document. La valeur par défaut de cette méthode est UTF-8.

Erreurs DOM MSXML

Deux erreurs courantes retournées par les méthodes d’interface DOM (Document Object Model) XML sont les suivantes :

  • Un caractère non valide a été trouvé dans le contenu du texte.

  • Passez de l’encodage actuel à l’encodage spécifié non pris en charge.

Avec la méthode de chargement de l’interface IXMLDOMDocument , ces erreurs se produisent généralement dans les conditions suivantes :

  • Aucun encodage n’est spécifié, aucune marque d’ordre d’octet n’est trouvée au début du fichier XML et les données contiennent des caractères spéciaux

  • L’encodage spécifié ne correspond pas à l’encodage réel des données XML. Une bonne pratique consiste à toujours spécifier l’encodage correct à l’intérieur de la déclaration XML, plutôt que d’accepter l’encodage par défaut.

Avec les analyseurs MSXML versions 2.5, 2.5 SP1 et 2.6, la méthode loadXML de IXMLDOMDocument ne peut charger que des données encodées en UTF-16 ou UCS-2. Toute tentative de chargement de données XML encodées avec un autre format d’encodage entraîne l’erreur suivante :

Passez de l’encodage actuel à l’encodage spécifié non pris en charge. Avec la version de MSXML 3.0 (Msxml3.dll), cette restriction est supprimée et le code suivant s’exécute sans erreur :

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

Remarque

La propriété xml de l’interface IXMLDOMDocument écrit les données XML encodées en UTF-16, mais sans la marque d’ordre d’octet au début. Cela peut entraîner des problèmes d’encodage.

Vous pouvez également recevoir ces erreurs lorsque vous appelez la transformNode méthode de l’interface IXMLDOMNode avec un fichier XSL ou XSLT dans lequel les informations d’encodage XML sont spécifiées comme suit :

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

La transformNode méthode retourne une BSTR encodée en UTF-16 par définition. Une meilleure façon de conserver l’encodage consiste à appeler la transformNodeToObject méthode et à stocker les résultats dans un flux ou dans un nouveau document XML, puis à l’enregistrer.

Références

Espace de noms System.Xml