web-dev-qa-db-fra.com

Comment trouver le nombre d'éléments dans l'arbre des éléments en python?

Je suis nouveau dans l’arbre des éléments, ici j’essaie de trouver le nombre d’éléments dans l’arbre des éléments.

from lxml import etree 
root = etree.parse(open("file.xml",'r'))

est-il possible de trouver le nombre total d'éléments dans la racine?

7
mariz

Recherchez tous les éléments cibles (il existe quelques moyens de le faire), puis utilisez la fonction intégrée len() pour obtenir le nombre Par exemple, si vous voulez compter uniquement les éléments enfants directs de root:

from lxml import etree 
doc = etree.parse("file.xml")
root = doc.getroot()

result = len(root.getchildren())

ou, si vous voulez compter tous les éléments de l'élément racine:

result = len(root.xpath(".//*"))
9
har07

Une autre façon d’obtenir le nombre de sous-éléments:

len(list(root))
4
ThomasW

Vous n'avez pas à charger tous les nœuds dans une liste, vous pouvez utiliser sum et iter par la suite:

from lxml import etree 
root = etree.parse(open("file.xml",'r'))
count = sum(1 for _ in root.iter("*"))
4
Padraic Cunningham

vous pouvez trouver le nombre de chaque élément comme ceci:

from lxml import objectify

file_root = objectify.parse('path/to/file').getroot()
file_root.countchildren()  # root's element count
file_root.YourElementName.countchildren()  # count of children in any element
0
SanD
#  I used the len(list(  )) as a way to get the list of items in a feed, as I 
# copy more items I use the original len to break out of a for loop, otherwise
# it would keep going as I add items.  Thanks ThomasW  for that code.   

import xml.etree.ElementTree as ET

    def feedDoublePosts(xml_file, item_dup):
        tree = ET.ElementTree(file=xml_file)
        root = tree.getroot()
        for a_post in tree.iter(item_dup):
            goround = len(list(a_post))
            for post_children in a_post:
                if post_children != a_post:
                a_post.append(post_children)
                goround -= 1
                if goround == 0:
                    break
        tree = ET.ElementTree(root)
        with open("./data/updated.xml", "w") as f:
            tree.write(f)

    # ----------------------------------------------------------------------
    if __== "__main__":
        feedDoublePosts("./data/original_appt.xml", "appointment")
0
Brian Kay Walker