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)
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 [...]使文本和二进制数据成为不同类型,不能盲目地混合在一起.
我们可以通过使用decode()
显式转换我们的bytestring到常规文本来解决这种歧义.这确保了与Python 2和Python 3的兼容性.
.tostring()
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指出Element
Python 2和3之间的数据类型发生了变化.
在大多数情况下,使用ElementTree.Element
将是将对象转换为字符串的" cannonical "方式.不幸的是,使用它ElementTree.tostring()
会将对象在内存中的位置作为十六进制字符串返回,而不是对象数据的字符串表示形式.
<Person Name="John" />
Run Code Online (Sandbox Code Playgroud)