и я надеялся, что есть более простой способ, чем этот. Даже с таким коротким примером, как этот, XSLT является многословным и трудным для понимания по сравнению с кодом в моем вопросе о простом удалении элементов.

полностью удалить данный элемент из 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>

Мне кажется, что, поскольку API ElementTree работает с текстом через.text а также.tail атрибуты каждого элемента, а не узлы в дереве, это означает, что вам приходится иметь дело с множеством различных случаев в зависимости от того, имеет ли элемент родственные элементы или нет, имеет ли существующий элемент.tail атрибут и так далее. Я пропустил какой-то простой способ сделать это?

Ответы на вопрос(3)

Ваш ответ на вопрос