每当我打电话ElementTree.tostring(e)
我收到以下错误信息:
AttributeError: 'Element' object has no attribute 'getroot'
是否有任何其他方式使用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'
Element
对象没有.getroot()
方法。 放下这一号召,和.tostring()
调用工作:
xmlstr = ElementTree.tostring(et, encoding='utf8', method='xml')
如何转换ElementTree.Element
为String?
对于在两个Python的2和3,使用有效的解决方案.tostring()
和.decode()
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,这两种类型在Python 3中变得更加明显。
在Python 2,你可以使用str
的文本和二进制数据类型 。 不幸的是这种融合的两个不同的概念可能导致脆弱的代码有时工作了两种类型的数据,有时没有。 [...]
为了使文本和二进制数据更清晰,更明显的区别,Python 3中[...]由文本和二进制数据不同的类型,而且不能盲目地混合在一起 。
来源: 移植的Python 2代码到Python 3
我们可以解决这种不确定性使用decode()
给我们的字节串明确地转换为普通文本。 这确保了与两者的Python 2和Python 3的相容性。
- 对于Python 2&3兼容性:
ElementTree.tostring(xml).decode()
- 对于Python 3兼容性:
ElementTree.tostring(xml, encoding='unicode', method='xml')
作为参考,我已经包括的比较.tostring()
的Python 2和Python 3之间的结果。
ElementTree.tostring(xml).decode()
# Python 3: <Person Name="John" />
# Python 2: <Person Name="John" />
ElementTree.tostring(xml, encoding='unicode', method='xml')
# Python 3: <Person Name="John" />
# Python 2: LookupError: unknown encoding: unicode
ElementTree.tostring(xml, encoding='utf-8', method='xml')
# Python 3: b'<Person Name="John" />'
# Python 2: <Person Name="John" />
ElementTree.tostring(xml, encoding='utf8', method='xml')
# Python 3: b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<Person Name="John" />'
# Python 2: <?xml version='1.0' encoding='utf8'?>
# <Person Name="John" />
由于马亭彼得斯用于指出了str
数据类型Python 2和3之间改变。
为什么不使用STR()?
在大多数情况下,使用str()
将是“ cannonical ”的方式将对象转换为字符串。 不幸的是,使用这种与Element
在内存中返回对象的位置,作为一个十六进制串,而不是对象的数据的字符串表示。
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>