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.
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.