9.5. 搜索元素

通过遍历每个节点来遍历 XML 文档可能会很乏味。如果您正在寻找 XML 文档深处埋藏的特定内容,可以使用一个快捷方式快速找到它:getElementsByTagName

在本节中,您将使用 binary.xml 语法文件,如下所示

示例 9.20. binary.xml

<?xml version="1.0"?>
<!DOCTYPE grammar PUBLIC "-//diveintopythonbook.pythonlang.cn//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 文档的根级对象。这确实找到了根 grammar 元素中 ref 元素内嵌套的 p 元素。
2 前两个 p 元素位于第一个 ref'bit' ref)内。
3 最后一个 p 元素是第二个 ref'byte' ref)内的那个。