web-dev-qa-db-fra.com

Comment analyser correctement xml utf-8 avec ElementTree?

J'ai besoin d'aide pour comprendre pourquoi l'analyse de mon fichier xml * avec xml.etree.ElementTree produit les erreurs suivantes.

* Mon fichier xml de test contient des caractères arabes.

Tâche: Ouvrir et analyser utf8_file.xml fichier.

Mon premier essai:

import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
    xml_tree = etree.parse(utf8_file)

Résultat 1:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 236-238: ordinal not in range(128)

Mon deuxième essai:

import xml.etree.ElementTree as etree
with codecs.open('utf8_file.xml', 'r', encoding='utf-8') as utf8_file:
    xml_string = etree.tostring(utf8_file, encoding='utf-8', method='xml')
    xml_tree  = etree.fromstring(xml_string)

Résultat 2:

AttributeError: 'file' object has no attribute 'getiterator'

Veuillez expliquer les erreurs ci-dessus et commenter la solution possible.

15
minerals

Laissez le décodage des octets à l'analyseur; ne pas décoder en premier:

import xml.etree.ElementTree as etree
with open('utf8_file.xml', 'r') as xml_file:
    xml_tree = etree.parse(xml_file)

Un fichier XML doit contenir suffisamment d'informations dans la première ligne pour gérer le décodage par l'analyseur. Si l'en-tête est manquant, l'analyseur doit supposer que l'UTF-8 est utilisé.

Étant donné que c'est l'en-tête XML qui contient ces informations, il incombe à l'analyseur d'effectuer tout le décodage.

Votre première tentative a échoué car Python essayait de encoder les valeurs Unicode à nouveau pour que l'analyseur puisse gérer les chaînes d'octets comme prévu. La deuxième tentative a échoué car la fonction etree.tostring() attend un arbre analysé comme premier argument, pas une chaîne unicode.

14
Martijn Pieters