Легко полностью удалить данный элемент из XML-документа с помощью lxml реализации ElementTree API, но я не вижу простого способа последовательной замены элемента некоторым текстом. Например, с учетом следующего ввода:
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
и т. д. Я пропустил какой-то простой способ сделать это?