【发布时间】:2011-07-22 01:13:53
【问题描述】:
使用 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/>的父级? -
在这种情况下,我只想删除
<r>节点及其所有子节点,并将其替换为文本字符串。希望这更容易:)
标签: python xml lxml elementtree