| You are here: Inicio > Inmersión en Python > Scripts y flujos > Creación de manejadores diferentes por tipo de nodo | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
El tercer consejo útil para procesamiento de XML implica separar el código en funciones lógicas, basándose en tipos de nodo y nombres de elemento. Los documentos XML analizados se componen de varios tipos de nodos que representa cada uno un objeto de Python. El nivel raíz del documento en sí lo representa un objeto Document. El Document contiene uno o más objetos Element (por las etiquetas XML), cada uno de los cuales contiene otros objetos Element, Text (para zonas de texto) o Comment (para los comentarios). Python hace sencillo escribir algo que separe la lógica por cada tipo de nodo.
>>> from xml.dom import minidom >>> xmldoc = minidom.parse('kant.xml')>>> xmldoc <xml.dom.minidom.Document instance at 0x01359DE8> >>> xmldoc.__class__
<class xml.dom.minidom.Document at 0x01105D40> >>> xmldoc.__class__.__name__
'Document'
| Asuma por un momento que kant.xml está en el directorio actual. | |
| Como vio en Sección 9.2, “Paquetes”, el objeto devuelto al analizar un documento XML es un Document, tal como se define en minidom.py en el paquete xml.dom. Como vio en Sección 5.4, “Instanciación de clases”, __class__ es un atributo que incorpora todo objeto de Python. | |
| Es más, __name__ es un atributo que incorpora toda clase de Python, y ésta es su cadena. Esta cadena no tiene nada de misterioso; es el mismo nombre de la clase que escribe cuando define una clase usted mismo (vea Sección 5.3, “Definición de clases”). |
Bien, ahora podemos obtener el nombre de la clase de cualquier nodo XML (ya que cada nodo se representa con un objeto de Python). ¿Cómo puede aprovechar esto para separar la lógica al analizar cada tipo de nodo? La respuesta es getattr, que ya vio en Sección 4.4, “Obtención de referencias a objetos con getattr”.
def parse(self, node):
parseMethod = getattr(self, "parse_%s" % node.__class__.__name__)
parseMethod(node) 
def parse_Document(self, node):
self.parse(node.documentElement)
def parse_Text(self, node):
text = node.data
if self.capitalizeNextWord:
self.pieces.append(text[0].upper())
self.pieces.append(text[1:])
self.capitalizeNextWord = 0
else:
self.pieces.append(text)
def parse_Comment(self, node):
pass
def parse_Element(self, node):
handlerMethod = getattr(self, "do_%s" % node.tagName)
handlerMethod(node)En este ejemplo, las funciones despachadoras parse y parse_Element encuentras métodos en su misma clase. Si el procesamiento se vuelve complejo (o tenemos muchos tipos diferentes de etiquetas), podríamos dividir el código en módulos separados y usar importación dinámica para llamar a las funciones necesarias dentro de sus módulos. La importación dinámica la expondremos en Capítulo 16, Programación Funcional.
<< Encontrar hijos directos de un nodo |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Tratamiento de los argumentos en línea de órdenes >> |