<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    10.4. 查找節點的直接子節點

    解析 XML 文檔時,另一個有用的己技巧是查找某個特定元素的所有直接子元素。例如,在語法文件中,一個 ref 元素可以有數個 p 元素,其中每一個都可以包含很多東西,包括其他的 p 元素。你只要查找作為 ref 孩子的 p 元素,不用查找其他 p 元素的孩子 p 元素。

    你可能認為你只要簡單地使用 getElementsByTagName 來實現這點就可以了,但是你不可以這么做。getElementsByTagName 遞歸搜索并返回所有找到的元素的單個列表。由于 p 元素可以包含其他的 p 元素,你不能使用 getElementsByTagName,因為它會返回你不要的嵌套 p 元素。為了只找到直接子元素,你要自己進行處理。

    例 10.16. 查找直接子元素

        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                              
    1 正如你在例 9.9 “獲取子節點”中看到的,childNodes 屬性返回元素所有子節點的一個列表。
    2 然而,正如你在例 9.11 “子節點可以是文本”中看到的,childNodes 返回的列表包含了所有不同類型的節點,包括文本節點。這并不是你在這里要查找的。你只要元素形式的孩子。
    3 每個節點都有一個 nodeType 屬性,它可以是ELEMENT_NODE, TEXT_NODE, COMMENT_NODE,或者其它值。可能值的完整列表在 xml.dom 包的 __init__.py 文件中。(關于包的介紹,參見第 9.2 節 “包”。) 但你只是對元素節點有興趣,所以你可以過濾出一個列表,其中只包含 nodeTypeELEMENT_NODE的節點。
    4 只要擁有了一個真實元素的列表,選擇任意一個都很容易。Python 有一個叫 random 的模塊,它包含了好幾個有用的函數。random.choice 函數接收一個任意數量條目的列表并隨機返回其中的一個條目。比如,如果 ref 元素包含了多個 p 元素,那么 choices 將會是 p 元素的一個列表,而 chosen 將被賦予其中的某一個值,而這個值是隨機選擇的。
    97av