J'ai ce fichier XML, appelé xmltest.xml:

<?xml version="1.0" encoding="GBK"?>
<productMeta>
    <bands>1,2,3,4</bands>
    <imageName>TestName.tif</imageName>  
    <browseName>TestName.jpg</browseName>
</productMeta>

Et j'ai ce code factice Python:

import xml.etree.ElementTree as ET
xmldoc = ET.parse('xmltest.xml')

Mais cela déclenche un ValueError:

ValueError: les encodages multi-octets ne sont pas pris en charge

Je comprends cette erreur, elle se déclenche car la déclaration de codage dans la première ligne du fichier XML. Le fichier XML est encodé en UTF-8 mais a toujours cette déclaration (je ne suis pas le créateur des fichiers XML à analyser). Comment puis-je éviter une telle déclaration de codage lors de l'analyse d'un fichier XML tel que l'ancien?

3
osjerick 13 juil. 2015 à 20:55

2 réponses

Meilleure réponse

Une chose que j'ai essayé, qui a fonctionné pour moi, est d'ouvrir le fichier xml en tant qu'objet fichier, puis d'utiliser ElementTree.fromstring() en passant le contenu complet du fichier.

Exemple -

>>> import xml.etree.ElementTree as ET
>>> ef = ET.parse('a.xml')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 1187, in parse
    tree.parse(source, parser)
  File "C:\Python34\lib\xml\etree\ElementTree.py", line 598, in parse
    self._root = parser._parse_whole(source)
ValueError: multi-byte encodings are not supported
>>> with open('a.xml','r') as f:
...     ef = ET.fromstring(f.read())
...
>>> ef
<Element 'productMeta' at 0x028DF180>

Vous pouvez également créer un XMLParser avec l'encodage requis, et cela devrait vous permettre de pouvoir analyser les chaînes de cet encodage, Exemple -

import xml.etree.ElementTree as ET
xmlp = ET.XMLParser(encoding="utf-8")
f = ET.parse('a.xml',parser=xmlp)
5
Anand S Kumar 13 juil. 2015 à 18:34
 ET.parse('a.xml', parser=ET.XMLParser(encoding='iso-8859-5'))

A résolu mon problème lorsqu'il a été traité avec xml excel en python

0
shui 24 sept. 2019 à 15:39