如何使用Python中的编码声明解析XML文件?

如何使用Python中的编码声明解析XML文件?,python,xml,encoding,Python,Xml,Encoding,我有一个XML文件,名为xmltest.XML: <?xml version="1.0" encoding="GBK"?> <productMeta> <bands>1,2,3,4</bands> <imageName>TestName.tif</imageName> <browseName>TestName.jpg</browseName> </productMet

我有一个XML文件,名为
xmltest.XML

<?xml version="1.0" encoding="GBK"?>
<productMeta>
    <bands>1,2,3,4</bands>
    <imageName>TestName.tif</imageName>  
    <browseName>TestName.jpg</browseName>
</productMeta>
但它会引发一个
ValueError

ValueError:不支持多字节编码


我理解这个错误,因为XML文件的第一行中的编码声明导致了这个错误。XML文件是UTF-8编码的,但始终具有该声明(我不是要分析的XML文件的创建者)。在解析XML文件(如前一个)时,如何避免这种编码声明?

我尝试过的一件事,对我来说很有效,就是将
XML
文件作为文件对象打开,然后使用
ElementTree.fromstring()
传递文件的完整内容

范例-

>>> 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>
import xml.etree.ElementTree as ET
xmlp = ET.XMLParser(encoding="utf-8")
f = ET.parse('a.xml',parser=xmlp)

在python中处理xml excel时解决了我的问题

请确保编码正确,以便可以读取xml文件中的字符串。另外,它是否给出了相同的错误?对不起,我不知道为什么,但它现在可以工作。:)你能解释一下为什么你的解决方案有效吗?这个解决方案有效的原因是,当我们使用
fromstring
时,我们只是传递字符串(解析器通常假设它的编码正确,等等),这样就不会导致错误。另外,对于这一点,还有一种解决方案,即使用指定的编码创建xml解析器。我也更新了答案。哦,太好了。再次感谢。
import xml.etree.ElementTree as ET
xmlp = ET.XMLParser(encoding="utf-8")
f = ET.parse('a.xml',parser=xmlp)
 ET.parse('a.xml', parser=ET.XMLParser(encoding='iso-8859-5'))