В чем разница между iterdescendants () и iterchildren () в l xml? - PullRequest
1 голос
/ 08 января 2020

В библиотеке L XML python, как выполнить итерацию? и в чем разница между iterdescendants () и iterchildren () в l xml python?

Ответы [ 3 ]

2 голосов
/ 08 января 2020

Используя iterchildren вы перебираете прямые дочерние элементы (для дерева ниже это означает, что вы перебираете только 7,5), а iterdescendants вы перебираете прямые или косвенные дочерние элементы (в случае дерева ниже вы будете итерация более 7,5,2,6 ... et c.)

enter image description here

0 голосов
/ 08 января 2020

Мы можем выполнять итерации по тегам, используя следующие итерации:

iterancestors (self, tag = None, * tags) Итерировать по предкам этого элемента (от родителя к родителю).

iterchildren (self, tag = None, reversed = False, * tags) Перебирать дочерние элементы этого элемента.

iterdescendants (self, tag = None, * tags) Перебирать потомков этого элемента в порядке документа.

iterfind (self, path, namespaces = None) Итерирует по всем соответствующим подэлементам по имени тега или пути.

itersiblings (self, tag = None, previousing = False, * tags) Итерировать по следующим или предшествующим братьям и сестрам этого элемента.

Разницу можно понять с помощью следующего кода

from lxml import etree
xml_str = '<main><child><c1><c11/><c12/></c1><c2/></child><child1/><child2/></main>'
parser = etree.XMLParser(ns_clean=True)
root = etree.XML(xml_str,parser)

Iterdescendats () вернет также все дочерние элементы и все теги в дочерних тегах

for i in root[0].iterdescendants():
    print(i.tag) 

output:
c1
c11
c12
c2

Iterchildren () вернет только дочерние теги

for i in root[0].iterchildren():
    print(i.tag)

output:
c1
c2
0 голосов
/ 08 января 2020

когда вы используете iterchildren (), вы перебираете дочерние элементы первого уровня. Когда вы используете iterdescendants (), вы перебираете childs и childs childs.

...