Zanurkuj w Pythonie/Wyszukanie bezpośrednich elementów potomnych
Wyszukanie bezpośrednich elementów potomnych
[edytuj]Inną przydatną techniką przy parsowaniu dokumentów XML jest odnajdywanie wszystkich bezpośrednich elementów potomnych (dzieci) danego elementu. Na przykład w pliku gramatyki element ref może mieć szereg elementów p, a każdy z nich może zawierać wiele rzeczy, włącznie z innymi elementami p. Chcemy wyszukać tylko te elementy p, które są potomkami elementu ref, a nie elementy p, które są potomkami innych elementów p.
Pewnie myślisz, że możesz do tego celu po prostu użyć funkcji getElementsByTagName, ale niestety nie możesz. Funkcja getElementsByTagName przeszukuje rekurencyjnie i zwraca pojedyncza listę wszystkich elementów jakie znajdzie. Ponieważ elementy p mogą zawierać inne elementy p, nie możemy użyć funkcji getElementsByTagName. Zwróciłaby ona zagnieżdżone elementy p, a tego nie chcemy. Aby znaleźć tylko bezpośrednie elementy potomne, musimy to wykonać samodzielnie.
def randomChildElement(self, node):
choices = [e for e in node.childNodes
if e.nodeType == e.ELEMENT_NODE] #(1) (2) (3)
chosen = random.choice(choices) #(4)
return chosen
- Jak już widzieliśmy w przykładzie 9.9, "Pobieranie węzłów potomnych", atrybut
childNodeszwraca listę wszystkich elementów potomnych danego elementu. - Jednakże, jak już widziałeś w przykładzie 9.11, "Węzłami potomnymi może być także tekst", lista zwrócona przez
childNodeszawiera całą różnorodność typów węzłów, włączając to węzły tekstowe. W tym wypadku szukamy jednak tylko potomków, które są elementami. - Każdy węzeł posiada atrybut
nodeType, który może przyjmować wartościELEMENT_NODE,TEXT_NODE,COMMENT_NODEi wiele innych. Pełna lista możliwych wartości znajduje się w pliku __init__.py w pakieciexml.dom. (Zajrzyj do podrozdziału 9.2, "Pakiety", aby się więcej dowiedzieć o pakietach.) Ale my jesteśmy zainteresowani węzłami, które są elementami, a więc możemy odfiltrować z listy tylko te elementy, których atrybutnodeTypejest równyELEMENT_NODE. - Gdy tylko mamy już listę właściwych elementów, wybór losowego elementu jest łatwy. Python udostępnia moduł o nazwie
random, który zawiera kilka funkcji. Funkcjarandom.choicepobiera listę z dowolną ilością elementów i zwraca losowy element. Np. jeśli element ref zawiera kilka elementów p, to choices będzie listą elementów p, a dochosenzostanie przypisany dokładnie jeden z nich, wybrany losowo.