Como substituir um elemento pelo texto em lxml?
É fácil remover completamente um determinado elemento de um documento XML com a implementação da API ElementTree do lxml, mas não vejo uma maneira fácil de substituir consistentemente um elemento por algum texto. Por exemplo, dada a seguinte entrada:
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>
'''
... você pode remover facilmente todos os<r>
elemento com:
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)
No entanto, como você substituirá cada elemento pelo texto, para obter a saída:
<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>
Parece-me isso porque a API ElementTree lida com texto através do.text
e.tail
atributos de cada elemento em vez de nós na árvore, isso significa que você precisa lidar com muitos casos diferentes, dependendo se o elemento possui elementos irmãos ou não, se o elemento existente possui um.tail
attribute e assim por diante. Perdi alguma maneira fácil de fazer isso?