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
属性がありました。これを行う簡単な方法を見逃しましたか?