我需要在更改后将XML ElementTree转换为String。这是toString部分无效。
import xml.etree.ElementTree as ET
tree = ET.parse('my_file.xml')
root = tree.getroot()
for e in root.iter('tag_name'):
e.text = "something else" # This works
# Now I want the the complete XML as a String with the alteration
我尝试了以下各种版本,ET或ElementTree作为各种名称,并导入toString等等,
s = tree.tostring(ET, encoding='utf8', method='xml')
我见过 Convert Python ElementTree to string 和其他一些人,但我不确定如何将它应用到我的例子中。
答案 0 :(得分:6)
这应该有效: -
xmlstr = ET.tostring(root, encoding='utf8', method='xml')
答案 1 :(得分:4)
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()
默认情况下不会返回字符串。默认行为是generate a bytestring。虽然这在Python 2中不是一个问题,但这两种类型在Python 3中更加明显。
在Python 2中,您可以将
str
类型用于文本和二进制数据。 不幸的是,这两种不同概念的融合可能导致 脆弱的代码有时适用于任何一种数据 不。 [...]为了使文本和二进制数据之间的区别更加清晰和明显, [Python 3]使文本和二进制数据不同的类型不能盲目地混合在一起。
来源:Porting Python 2 Code to Python 3
我们可以使用decode()
将字节字符串显式转换为常规文本来解决这种歧义。这确保了与Python 2和Python 3的兼容性。
ElementTree.tostring(xml).decode()
ElementTree.tostring(xml, encoding='unicode')
作为参考,我已经将Python 2和Python 3之间的.tostring()
结果进行了比较。
ElementTree.tostring(xml).decode()
# Python 3: <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, encoding='utf8')
# Python 3: b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<Person Name="John" />'
# Python 2: <?xml version='1.0' encoding='utf8'?>
# <Person Name="John" />
感谢Martijn Peters指出在Python 2和3之间更改了str
数据类型。
在大多数情况下,使用str()
将是&#34; cannonical&#34;将对象转换为字符串的方法。不幸的是,使用Element
将其作为十六进制字符串返回内存中的对象位置,而不是对象数据的字符串表示。
from xml.etree import ElementTree
xml = ElementTree.Element("Person", Name="John")
print(str(xml)) # <Element 'Person' at 0x00497A80>