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

    9.5. 搜索元素

    通過一步步訪問每一個節點的方式遍歷 XML 文檔可能很乏味。如果你正在尋找些特別的東西,又恰恰它們深深埋入了你的 XML 文檔,有個捷徑讓你可以快速找到它:getElementsByTagName

    在這部分,將使用 binary.xml 語法文件,它的內容如下:

    例 9.20. binary.xml

    <?xml version="1.0"?>
    <!DOCTYPE grammar PUBLIC "-//diveintopython.org//DTD Kant Generator Pro v1.0//EN" "kgp.dtd">
    <grammar>
    <ref id="bit">
      <p>0</p>
      <p>1</p>
    </ref>
    <ref id="byte">
      <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
    <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
    </ref>
    </grammar>

    它有兩個 ref'bit' (位) 和 'byte' (字節)。一個 bit'0' 或者 '1',而一個 byte 是 8 個 bit

    例 9.21. getElementsByTagName 介紹

    >>> from xml.dom import minidom
    >>> xmldoc = minidom.parse('binary.xml')
    >>> reflist = xmldoc.getElementsByTagName('ref') 1
    >>> reflist
    [<DOM Element: ref at 136138108>, <DOM Element: ref at 136144292>]
    >>> print reflist[0].toxml()
    <ref id="bit">
      <p>0</p>
      <p>1</p>
    </ref>
    >>> print reflist[1].toxml()
    <ref id="byte">
      <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
    <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
    </ref>
    
    1 getElementsByTagName 接收一個參數,即要找的元素的名稱。它返回一個 Element 對象的列表,列表中的對象都是有指定名稱的 XML 元素。在本例中,你能找到兩個 ref 元素。

    例 9.22. 每個元素都是可搜索的

    >>> firstref = reflist[0]                      1
    >>> print firstref.toxml()
    <ref id="bit">
      <p>0</p>
      <p>1</p>
    </ref>
    >>> plist = firstref.getElementsByTagName("p") 2
    >>> plist
    [<DOM Element: p at 136140116>, <DOM Element: p at 136142172>]
    >>> print plist[0].toxml()                     3
    <p>0</p>
    >>> print plist[1].toxml()
    <p>1</p>
    1 繼續前面的例子,在 reflist 中的第一個對象是 'bit' ref元素。
    2 你可以在這個 Element 上使用相同的 getElementsByTagName 方法來尋找所有在'bit' ref 元素中的<p>元素。
    3 和前面一樣,getElementsByTagName 方法返回一個找到元素的列表。在本例中,你有兩個元素,每“位”各占一個。

    例 9.23. 搜索實際上是遞歸的

    >>> plist = xmldoc.getElementsByTagName("p") 1
    >>> plist
    [<DOM Element: p at 136140116>, <DOM Element: p at 136142172>, <DOM Element: p at 136146124>]
    >>> plist[0].toxml()                         2
    '<p>0</p>'
    >>> plist[1].toxml()
    '<p>1</p>'
    >>> plist[2].toxml()                         3
    '<p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
    <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>'
    1 仔細注意這個例子和前面例子之間的不同。前面,你是在 firstref 中搜索 p 元素,但是這里你是在 xmldoc 中搜索 p 元素,xmldoc 是代表了整個 XML 文檔的根層對象。這樣就會 找到嵌套在 ref 元素 (它嵌套在根 grammar 元素中) 中的 p 元素。
    2 前兩個 p 元素在第一個 ref 內 ('bit' ref)。
    3 后一個 p 元素在第二個 ref 中 ('byte' ref)。
    97av