如何转换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()
将是将对象转换为字符串的“规范”方式。不幸的是,使用 this withElement
将对象在内存中的位置返回为十六进制字符串,而不是对象数据的字符串表示形式。
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>