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 № 1Vous 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>