将Python XML ElementTree转换为String

时间:2015-11-19 21:22:55

标签: python xml elementtree

我需要在更改后将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 和其他一些人,但我不确定如何将它应用到我的例子中。

2 个答案:

答案 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的兼容性。

  • 对于Python 2&amp; 3兼容性:ElementTree.tostring(xml).decode()
  • 对于Python 3兼容性: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()?

在大多数情况下,使用str()将是&#34; cannonical&#34;将对象转换为字符串的方法。不幸的是,使用Element将其作为十六进制字符串返回内存中的对象位置,而不是对象数据的字符串表示。

from xml.etree import ElementTree

xml = ElementTree.Element("Person", Name="John")
print(str(xml))  # <Element 'Person' at 0x00497A80>