9.5. Búsqueda de elementos

Recorrer un documento XML saltando por cada nodo puede ser tedioso. Si está buscando algo en particular, escondido dentro del documento XML, puede usar un atajo para encontrarlo rápidamente: getElementsByTagName.

En esta sección usaremos el fichero de gramática binary.xml, que es así:

Ejemplo 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>

Tiene dos ref, 'bit' y 'byte'. Un bit puede ser '0' o '1', y un byte es 8 bits.

Ejemplo 9.21. Presentación de 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 toma un argumento, el nombre del elemento que desea encontrar. Devuelve una lista de elementos Element que corresponden a los elementos XML que llevan ese nombre. En este caso, encontró dos elementos ref.

Ejemplo 9.22. Puede buscar cualquier elemento

>>> 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 Siguiendo con el ejemplo anterior, el primer objeto de reflist es el elemento ref 'bit'.
2 Puede usar el mismo método getElementsByTagName sobre este Element para encontrar todos los elementos <p> dentro del elemento ref 'bit'.
3 Igual que antes, el método getElementsByTagName devuelve una lista de todos los elementos que encuentra. En este caso hay dos, uno por cada bit.

Ejemplo 9.23. La búsqueda es recursiva

>>> 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 Observe atentamente la diferencia entre este ejemplo y el anterior. Antes estábamos buscando elementos p dentro de firstref, pero ahora estamos buscando elementos p dentro de xmldoc, el objeto raíz que representa todo el documento XML. Esto encuentra los elementos p anidados dentro de los elementos ref dentro del elemento grammar.
2 Los dos primeros elementos p están dentro del primer ref (el ref 'bit').
3 El último elemento p es el que está dentro del segundo ref (el ref 'byte').