在控制台上打印出 XML(xml.etree.ElementTree)

3

我需要将从响应中接收到的xml打印到控制台:

import xml.etree.ElementTree as ET        

xml = req.text
result = ET.ElementTree(ET.fromstring(xml))

rough_string = ET.tostring(result, "utf-8")
reparsed = minidom.parseString(rough_string)
print reparsed.toprettyxml(indent="\t")

错误信息:

AttributeError: 'ElementTree' object has no attribute 'tag'
  File "....", line x, in ...
    rough_string = ET.tostring(result, "utf-8")
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1126, in tostring
    ElementTree(element).write(file, encoding, method=method)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 820, in write
    serialize(write, self._root, encoding, qnames, namespaces)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 900, in _serialize_xml
    tag = elem.tag
AttributeError: 'ElementTree' object has no attribute 'tag'

错误的完整回溯是什么? - Martijn Pieters
3
另外,不要将Unicode文本提供给XML解析器;总是提供一个字节串。解析器的工作是根据XML声明解码数据。 - Martijn Pieters
1个回答

8

您正在将已经创建的ElementTree对象传回给ElementTree:

result = ET.ElementTree(ET.fromstring(xml))

不要这样做;删除那里的ET.ElementTree()调用:
result = ET.fromstring(xml)

现在你的 ET.tostring() 调用将会起作用。
接下来,我看到你正在使用 req.text 作为 XML 的源;如果这是一个 requests 响应对象,那么传递这个参数是 错误的,你应该使用 req.content。XML 解析器应该传递一个 字节字符串,而不是一个 unicode 值。解析器将根据 XML 声明进行解码。它可能对仅包含 ASCII 文本的文档有效,但任何包含超出 ASCII 字符集的文本的文档都将失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接