2015-07-20 19 views
5

Używam biblioteki python lxml do transformacji plików XML do nowego schematu, ale wystąpiły problemy z przetwarzaniem instrukcji przetwarzania z treści XML.Usuwanie instrukcji przetwarzania za pomocą Python lxml

elementami instrukcji przetwarzania są rozproszone po całym XML, jak w poniższym przykładzie (wszystkie zaczynają się od „Oasys” i kończy z unikalnym kodem):

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>" 

nie mogę zlokalizować ich poprzez metoda, chociaż etree.getchildren() zwraca je:

tree = lxml.etree.fromstring(string) 
print tree.findall(".//") 
>>>> [<Element i at 0x747c>] 
print tree.getchildren() 
>>>> [<?oasys _dc21-?>, <Element i at 0x747x>] 
print tree.getchildren()[0].tag 
>>>> <built-in function ProcessingInstruction> 
print tree.getchildren()[0].tail 
>>>> Text 

Czy istnieje alternatywa do korzystania getchildren() do analizowania i usunąć instrukcje przetwarzania, zwłaszcza biorąc pod uwagę, że są one zagnieżdżone na różnych poziomach thro po pliku XML?

Odpowiedz

6

Możesz użyć testu węzła XPath processing-instruction(), aby znaleźć instrukcje przetwarzania i usunąć je za pomocą etree.strip_tags().

Przykład:

from lxml import etree 

string = "<text><?oasys _dc21-?>Text <i>contents</i></text>" 
tree = etree.fromstring(string) 

pis = tree.xpath("//processing-instruction()") 
for pi in pis: 
    etree.strip_tags(pi.getparent(), pi.tag) 

print etree.tostring(tree) 

wyjściowa:

<text>Text <i>contents</i></text> 
+0

pan rzeczywiście rozwiązać dwa problemy z odpowiedzią - Nie wiedziałem o strip_tags() funkcji, ale jest to bardzo przydatne! –

Powiązane problemy