J'utilise le module Python ElementTree intégré. Il est facile d'accéder aux enfants, mais qu'en est-il des nœuds parents ou frères? - Est-ce que cela peut être fait efficacement sans traverser l'arbre entier?accéder au nœud parent du nœud ElementTree
Répondre
Il n'existe aucun support direct sous la forme d'un attribut parent
, mais vous pouvez utiliser les modèles décrits here pour obtenir l'effet souhaité. La seule ligne suivante est proposée (à partir du lien à afficher) pour créer un mappage enfant à des parents pour un arbre entier:
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
Vinay's answer devrait fonctionner, mais pour Python 2.7+ et le 3.2+ il est recommandé:
parent_map = {c:p for p in tree.iter() for c in p}
getiterator()
est dépréciée en faveur de iter()
, et il est agréable d'utiliser le nouveau constructeur de compréhension de la liste dict
. Deuxièmement, lors de la construction d'un document XML, il est possible qu'un enfant ait plusieurs parents, bien que cela soit supprimé une fois que vous avez sérialisé le document. Si cela est important, vous pouvez essayer ceci:
parent_map = {}
for p in tree.iter():
for c in p:
if c in parent_map:
parent_map[c].append(p)
# Or raise, if you don't want to allow this.
else:
parent_map[c] = [p]
# Or parent_map[c] = p if you don't want to allow this
Que faire si vous n'avez pas accès à l'arborescence? Comme après un .find() – Brett
je ne connais aucun moyen d'obtenir le nœud racine (et donc les parents/ancêtres) si vous n'avez pas enregistré une référence à celui-ci. Mais je ne comprends pas comment '.find()' a quelque chose à voir avec ça. – supergra
Je viens d'utiliser '.find()' comme exemple de fonction qui retourne juste un élément – Brett
Une autre façon si vous voulez juste un seul parent de subElement et aussi le xpath de subElement.
parentElement = subElement.find(xpath+"/..")
Ne fonctionne pas pour moi, je reçois 'None' - même si j'utilise simplement 'subElement.find ('..')'. – damian
Si vous utilisez lxml, j'ai pu obtenir l'élément parent ce qui suit:
parent_node = next(child_node.iterancestors())
Cela déclenche une exception StopIteration
si l'élément n'a pas d'ancêtres - alors soyez prêt pour attraper cela si vous pouvez rencontrer dans ce scénario.
Vous pouvez utiliser la notation xpath ...
dans ElementTree.
<parent>
<child id="123">data1</child>
</parent>
xml.findall('.//child[@id="123"]...')
>> [<Element 'parent'>]
Ceci est une solution fantastique, fonctionne avec find() aussi si vous savez qu'il n'y a qu'un seul élément que vous recherchez. Comme si: 'root.find (" .//*[@nom_test = 'generated_sql'] ... ")' – Bostone
Comme mentionné dans Get parent element after using find method (xml.etree.ElementTree) vous devez faire une recherche indirecte pour les parents. Ayant xml:
<a>
<b>
<c>data</c>
<d>data</d>
</b>
</a>
En supposant que vous avez créé l'élément etree dans la variable xml
, vous pouvez utiliser:
In[1] parent = xml.find('.//c/..')
In[2] child = parent.find('./c')
Entraînant:
Out[1]: <Element 'b' at 0x00XXXXXX>
Out[2]: <Element 'c' at 0x00XXXXXX>
parent supérieur se trouve que: secondparent=xml.find('.//c/../..')
étant <Element 'a' at 0x00XXXXXX>
Regardez le 19.7.2.2. section: Supported XPath syntax ...
parent de Recherche noeud en utilisant le chemin:
parent_node = node.find('..')
Avez-vous testé cela? Si vous étiez en mesure de le faire fonctionner, veuillez poster un exemple de code complet qui le démontre. Voir ce commentaire: https://stackoverflow.com/questions/2170610/access-elementtree-node-parent-node#comment44519212_21963494 – mzjn
La documentation Python 3 dit: "Renvoie' None' si le chemin tente d'atteindre les ancêtres du début élément (l'élément 'find' a été appelé)." (https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax). – mzjn
Fonctionne pour moi. La réponse la meilleure et la plus cohérente. – ToTenMilan
- 1. parent suppression du nœud
- 2. Transférer le contenu du champ du nœud "parent" au nœud "enfant" dans Drupal
- 3. Référence au nœud parent dans XSD?
- 4. noeud copie attribue au nœud parent
- 5. Trouver un nœud parent?
- 6. Supprimer le lien du nœud parent treeview
- 7. Récupère le nom du nœud parent
- 8. Testez d'abord sous-nœud du nœud
- 9. Création d'un nœud enfant à partir d'un nœud parent
- 10. jQuery - nœud précédent - pas de nœud parent commun
- 11. Comment sélectionner le nœud parent d'un nœud enfant?
- 12. Python ElementTree Vérifiez le type de nœud/élément
- 13. Sélection du nœud parent/ancêtre en fonction de la valeur du nœud enfant
- 14. Implémentation de l'arborescence PHP: accès au nœud parent
- 15. id du noeud Comparaison parent du nœud enfant dans ExtJS
- 16. PHP XMLReader obtient le nœud parent?
- 17. rechercher un nœud parent dans treeview
- 18. CSS obtenir la largeur du nœud parent .... sans expressions
- 19. XSLT divisé au nœud enfant
- 20. Accès au nœud d'un objet XML
- 21. Trouver l'index de caractère d'un nœud dans son nœud parent avec hpricot
- 22. Get HTML brut du nœud dans JQuery
- 23. Comment lire l'attribut d'un nœud parent d'un nœud enfant dans XSLT
- 24. Sélection du nœud AspxTreeList Problème
- 25. Est-il possible d'accéder au nœud parent à l'intérieur de la boucle?
- 26. Liaison d'objet facile au nœud Treeview
- 27. Accéder au thème du parent depuis iframe
- 28. Possibilité d'ajouter du contenu HTML au nœud SimpleXMLElement
- 29. Existe-t-il un raccourci clavier dans Visual Studio pour accéder au nœud XML/XHTML parent en mode code XML?
- 30. Création d'un nœud parent pour le document XML en C#
Voir http://stackoverflow.com/questions/374245/how-to-retrieve-the-parent-node-using- celementtree – kennytm