Problem jest następujący: Mam fragment XML tak:W lxml, jak usunąć tag, ale zachować całą zawartość?
<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>
na wynik, chcę usunąć wszystkie <a>
- i <c>
-Tags, ale zachowują swoje (tekstu) -contents i childNodes tylko tak jak oni. Ponadto, <b>
-Element powinien pozostać nietknięty. Wynik powinien wyglądać wtedy zatem
<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment>
Na razie, będę powrócić do bardzo brudne sztuczki: Będę etree.tostring fragment, usunąć tagi naruszające poprzez regex i zastąpić oryginalny fragment z etree.fromstring wynik ten (nie prawdziwy kod, ale powinno iść coś takiego):
from lxml import etree
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>")
fstring = etree.tostring(fragment)
fstring = fstring.replace("<a>","")
fstring = fstring.replace("</a>","")
fstring = fstring.replace("<c>","")
fstring = fstring.replace("</c>","")
fragment = etree.fromstring(fstring)
wiem, że mogę prawdopodobnie użyć XSLT do osiągnięcia tego celu, i wiem, że lxml mogą skorzystać z XSLT , ale musi być bardziej natywne podejście lxml?
Dla odniesienia: Próbowałem dostać się tam z lxml's element.replace, ale ponieważ chcę wstawić tekst, w którym był wcześniej węzeł elementu, nie sądzę, żebym mógł to zrobić.
Dzięki, to działa idealnie. Termin "pasek" nie przyszedł mi do głowy, albo sam mogłem znaleźć odpowiedź :) – Thor
Poważnie. Czy będziesz w PyCon 2011? Jeśli tak, pozwól, że kupię ci piwo lub jakikolwiek inny ulubiony napój. Właśnie zrobiłeś moją noc :) – mkelley33
Również niesamowite: '' etree.strip_elements (fragment, * ['tag1', 'tag2']) '' – mkelley33