python xml de requête get parent
J'ai un gros document xml qui ressemble à ceci:
<Node name="foo">
<Node name="16764764625">
<Val name="type"><s>3</s></Val>
<Val name="owner"><s>1</s></Val>
<Val name="location"><s>4</s></Val>
<Val name="brb"><n/></Val>
<Val name="number"><f>24856</f></Val>
<Val name="number2"><f>97000.0</f></Val>
</Node>
<Node name="1764466544">
<Val name="type"><s>1</s></Val>
<Val name="owner"><s>2</s></Val>
<Val name="location"><s>6</s></Val>
<Val name="brb"><n/></Val>
<Val name="number"><f>265456</f></Val>
<Val name="number2"><f>99000.0</f></Val>
</Node>
...
</Node>
Ma mission est de récupérer la valeur du nœud parent: 1764466544 (valeur de nom en 2ème Nœud) en faisant une recherche pour trouver si le sous-élément du nœud Val name="nombre" contient 265456
J'ai fait un tas de lecture sur XPath, et ElementTree, mais je ne sais pas encore par où commencer en fait cette requête. Vous cherchez des exemples... je ne trouve pas qui font référence à un nœud parent comme un résultat.
Encore python.. toutes les suggestions seraient appréciées.
Grâce
Vous devez vous connecter pour publier un commentaire.
Ce XPath:
Sorties:
/
:raise SyntaxError("cannot use absolute path on element")
. Peut-être essayer un de l'expression par rapport? CetteNode/Node[Val[@name='number']/f='265456']/@name
ou ce//Node/Node[Val[@name='number']/f='265456']/@name
Malheureusement, lors de l'utilisation de la ElementTree API, chaque
Element
objet n'a pas de référence à son parent, de sorte que vous ne peut pas aller en haut de l'arborescence à partir d'un point connu. Au lieu de cela, vous devez trouver le parent possible des objets et filtre à ceux que vous voulez.C'est généralement le cas avec les expressions XPath. Cependant, ElementTree prend uniquement en charge un sous-ensemble de XPath (voir les docs), la plupart des éléments utiles qui ont été ajoutées dans ElementTree 1.3, qui vient seulement avec Python 2.7+ 3,2+.
Et même, ElementTree de XPath, il ne peut pas travailler avec votre fichier est - il n'existe aucun moyen de sélectionner sur la base du texte d'un nœud, seulement ses attributs (ou les valeurs d'attribut).
Mon expérimentation a seulement trouvé deux façons de procéder avec ElementTree. Si vous utilisez Python 2.7+ (ou sont en mesure de télécharger et installer une version plus récente de ElementTree de travailler avec les anciennes versions de Python), et vous pouvez modifier le format du fichier XML pour mettre les chiffres en tant qu'attributs, comme
puis le code Python suivant, tirez sur les nœuds d'intérêt:
Pour les plus âgés des Pythons, ou si vous ne pouvez pas modifier le format XML, vous devrez filtrer les invalides nœuds manuellement. Le suivant a fonctionné pour moi:
Aucune de ces solutions est ce que j'appellerais l'idéal, mais ils sont les seuls que j'ai été en mesure de faire le travail avec l'ElementTree bibliothèque (puisque c'est ce que vous avez mentionné à l'aide). Vous feriez mieux d'utiliser une bibliothèque tierce, plutôt que de l'aide de l'; voir le Python wiki entrée sur XML pour une liste des options. lxml est les liaisons Python pour la plus largement utilisée de la bibliothèque libxml2, et serait celui que je suggère de regarder au premier abord. Il a en charge de XPath donc, vous devriez être en mesure d'utiliser les requêtes de l'autre des réponses.
La fonction suivante m'a aidé dans des cas similaires. Comme la docstring explique, il ne fonctionne pas dans le cas général, mais si votre nœuds sont uniques, il doit aider.
Généralement
sera de retour d'une potiner au nœud parent (lors de l'utilisation d'un DOM parser).
Pour XPath voir
http://www.tizag.com/xmlTutorial/xpathparent.php