将Python ElementTree转换为字符串

67 python xml marshalling elementtree

每当我打电话时ElementTree.tostring(e),都会收到以下错误消息:

AttributeError: 'Element' object has no attribute 'getroot'
Run Code Online (Sandbox Code Playgroud)

有没有其他方法将ElementTree对象转换为XML字符串?

追溯:

Traceback (most recent call last):
  File "Development/Python/REObjectSort/REObjectResolver.py", line 145, in <module>
    cm = integrateDataWithCsv(cm, csvm)
  File "Development/Python/REObjectSort/REObjectResolver.py", line 137, in integrateDataWithCsv
    xmlstr = ElementTree.tostring(et.getroot(),encoding='utf8',method='xml')
AttributeError: 'Element' object has no attribute 'getroot'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 83

Element对象没有.getroot()方法.删除该呼叫,并且.tostring()呼叫有效:

xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3中,`encoding ='utf8'`返回一个bytestring而不是一个字符串.[我建议使用`tostring(xml,encoding ="unicode")`而不是](/sf/answers/3407004961/). (7认同)
  • 用于从搜索引擎后来者:当编码是"UTF8"它预先将`<XML版本="1.0"编码="UTF8"?>`报头.当它是'utf-8`时,标题不包括在内.如果`et`是ElementTree,你必须传递`et.getroot()`. (2认同)

Ste*_*ica 24

如何转换ElementTree.Element为字符串?

对于适用于Python 2和3的解决方案,请使用ElementTree.tostring()str.

xml_str = ElementTree.tostring(xml, encoding='unicode')
Run Code Online (Sandbox Code Playgroud)

用法示例

xml_str = ElementTree.tostring(xml, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)

输出:

xml_str = ElementTree.tostring(xml).decode()
Run Code Online (Sandbox Code Playgroud)

说明

尽管名称暗示,默认情况下不返回字符串.默认行为是生成字节串.虽然这在Python 2中不是问题,但在Python 3中这两种类型更加明显.unicode

在Python 2中,您可以使用utf-8文本和二进制数据的类型.不幸的是,两种不同概念的这种融合可能会导致脆弱的代码,这种代码有时适用于任何一种数据,有时不适用.[...]

为了使文本和二进制数据之间的区别更加清晰和明显,Python 3 [...]使文本和二进制数据成为不同类型,不能盲目地混合在一起.

来源:将Python 2代码移植到Python 3

我们可以通过使用decode()显式转换我们的bytestring到常规文本来解决这种歧义.这确保了与Python 2和Python 3的兼容性.

  • 对于Python 2&3兼容性: .tostring()
  • 对于Python 3兼容性: str

作为参考,我已经包含了str()Python 2和Python 3之间的结果比较.

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
Run Code Online (Sandbox Code Playgroud)

感谢Martijn Peters指出ElementPython 2和3之间的数据类型发生了变化.


为什么不使用str()?

在大多数情况下,使用ElementTree.Element将是将对象转换为字符串的" cannonical "方式.不幸的是,使用它ElementTree.tostring()会将对象在内存中的位置作为十六进制字符串返回,而不是对象数据的字符串表示形式.

<Person Name="John" />
Run Code Online (Sandbox Code Playgroud)