/ / Suppression des instructions de traitement avec Python lxml - python, xml, lxml

Suppression des instructions de traitement avec Python lxml - python, xml, lxml

J'utilise la bibliothèque python lxml pour transformer des fichiers XML en un nouveau schéma, mais j’ai rencontré des problèmes lors de l’analyse des instructions de traitement à partir du corps XML.

Les éléments d'instruction de traitement sont dispersés dans le XML, comme dans l'exemple suivant (ils commencent tous par "oasys" et se terminent par un code unique):

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

Je ne peux pas les localiser à travers le lxml.etree.findall() méthode, bien que etree.getchildren() les renvoie:

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

Existe-t-il une alternative à l’utilisation de getchildren() analyser et supprimer les instructions de traitement, en particulier en considérant qu'elles sont "imbriquées à différents niveaux dans le XML?"

Réponses:

6 pour la réponse № 1

Vous pouvez utiliser le processing-instruction() XPath test de noeud pour trouver les instructions de traitement et les supprimer en utilisant etree.strip_tags().

Exemple:

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)

Sortie:

<text>Text <i>contents</i></text>