5.5. 搜索元素

通过深入到每个结点对XML文档进行遍历可能很乏味。如果你正要查找特别的东西,为了不被埋进XML文档中,你可以使用一个捷径快速找到它:getElementsByTagName

在这一部分,我们将使用 binary.xml 语法文件,它看上去象这样:

例 5.19. 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

例 5.20. 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 元素。

例 5.21. 每个元素都是可搜索的

>>> 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 方法返回所有它找到的元素的列表。在本例中,我们有两个,每位(bit)有一个。

例 5.22. 搜索实际上是递归的

>>> 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 (表示整个XML文件的根级别对象)内搜索 p 元素。这样就会找到嵌套在根 grammar 元素内的 ref 元素内的 p 元素。

2 前两个 p 元素是在第一个 ref'bit' ref)内。
3 最后一个 p 元素是在第二个 ref'byte' ref)的那个。