使用 lxml 的 ElementTree API 实现很容易从 XML 文档中完全删除给定元素,但是我看不到用一些文本一致地替换元素的简单方法。例如,给定以下输入:
input = '''<everything>
<m>Some text before <r/></m>
<m><r/> and some text after.</m>
<m><r/></m>
<m>Text before <r/> and after</m>
<m><b/> Text after a sibling <r/> Text before a sibling<b/></m>
</everything>
'''
...您可以使用以下方法轻松删除每个<r>
元素:
from lxml import etree
f = etree.fromstring(data)
for r in f.xpath('//r'):
r.getparent().remove(r)
print etree.tostring(f, pretty_print=True)
但是,您将如何用文本替换每个元素以获取输出:
<everything>
<m>Some text before DELETED</m>
<m>DELETED and some text after.</m>
<m>DELETED</m>
<m>Text before DELETED and after</m>
<m><b/>Text after a sibling DELETED Text before a sibling<b/></m>
</everything>
在我看来,因为 ElementTree API 通过每个元素的.text
and.tail
属性而不是树中的节点来处理文本,这意味着您必须根据元素是否具有兄弟元素来处理许多不同的情况,是否现有元素有一个.tail
属性,依此类推。我错过了一些简单的方法吗?