使用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
和.tail
属性处理文本而不是树中的节点,这意味着你必须处理很多不同的情况,具体取决于该元素是否有兄弟元素,现有元素是否具有.tail
属性等等。我错过了一些简单的方法吗?
<r/>
有子元素,您是否也想将它们删除?还是合并到<r/>
的父级元素中? - MattH<r>
节点及其所有子节点,并用文本字符串替换它。希望这样更容易 :) - Mark Longair