2015-07-20 12 views
5

Sto utilizzando la libreria lxml python per trasformare i file XML in un nuovo schema ma ho riscontrato problemi durante l'analisi delle istruzioni di elaborazione dal corpo XML.Rimozione delle istruzioni di elaborazione con Python lxml

Gli elementi di istruzioni di elaborazione sono sparsi in tutto il XML, come nel seguente esempio (tutti iniziano con "OASYS" e terminano con un codice univoco):

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

non posso individuarli attraverso il metodo, anche se etree.getchildren() li restituisce:

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 

c'è un'alternativa all'utilizzo getchildren() per analizzare e rimuovere le istruzioni di elaborazione, soprattutto se si considera che stanno annidati a vari livelli thro ughout the XML?

risposta

6

È possibile utilizzare il test del nodo XPath processing-instruction() per trovare le istruzioni di elaborazione e rimuoverle utilizzando etree.strip_tags().

Esempio:

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) 

uscita:

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

hai effettivamente risolto due problemi con la vostra risposta - non sapevo circa le strip_tags() funzione, ma è molto utile! –