<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            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 將被賦予其中的某一個值,而這個值是隨機選擇的。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线