如何转换ElementTree.Element
为字符串?
对于Python 3:
xml_str = ElementTree.tostring(xml, encoding='unicode')
对于Python 2:
xml_str = ElementTree.tostring(xml, encoding='utf-8')
为了与Python 2和3兼容
xml_str = ElementTree.tostring(xml).decode()
用法示例
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
xml_str = ElementTree.tostring(xml).decode()
print(xml_str)
输出:
<Person Name="John" />
说明
尽管顾名思义,ElementTree.tostring()
它还是在Python 2和3中默认返回一个字节字符串。这在Python 3中是一个问题,它使用Unicode作为字符串。
在Python 2中,可以将str
类型同时用于文本数据和二进制数据。不幸的是,两个不同概念的融合可能导致脆弱的代码有时对两种数据都起作用,有时却不起作用。[...]
为了使文本和二进制数据之间的区别更加清楚和明显,[Python 3]使文本和二进制数据成为了不同的类型,这些类型不能盲目地混合在一起。
来源:将Python 2代码移植到Python 3
如果我们知道使用的是哪个版本的Python,则可以将编码指定为unicode
或utf-8
。否则,如果我们需要同时与Python 2和3兼容,则可以使用decode()
转换为正确的类型。
作为参考,我对.tostring()
Python 2和Python 3的结果进行了比较。
ElementTree.tostring(xml)
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml, encoding='unicode')
# Python 3: <Person Name="John" />
# Python 2: LookupError: unknown encoding: unicode
ElementTree.tostring(xml, encoding='utf-8')
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml).decode()
# Python 3: <Person Name="John" />
# Python 2: <Person Name="John" />
感谢Martijn Peters指出str
数据类型在Python 2和3之间发生了变化。
为什么不使用str()?
在大多数情况下,使用str()
将是将对象转换为字符串的“规范”方法。不幸的是,将此参数与一起使用时Element
,会以十六进制字符串而不是对象数据的字符串表示形式返回对象在内存中的位置。
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>
<?xml version='1.0' encoding='utf8'?>
标头前添加。如果utf-8
是,则不包含标题。另外,如果et
是ElementTree,则必须通过et.getroot()
。