viernes, 5 de febrero de 2010

XML y Python - Operaciones básicas y II

Acceso a atributos en árbol DOM

Como antes, para acceder a atributos de elementos, el primer paso es analizar el documento XML utilizando la función minidom.parse(nombre_fichero) para crear el objeto árbol DOM. Utilizamos el atributo childNodes para navegar a través del árbol DOM.

from xml.dom import minidom
xml_documento = minidom.parse("c:\\python\\agenda.xml")
nodos = xml_documento.childNodes

Ahora tenemos una lista de los nodos hijos de la raíz del árbol. Solo falta determinar mediante la función hasAttribute(nombre_atributo) si el objeto nodo tiene (devuelve True) ó no tiene (devuelve False) el atributo nombre_atributo. Si el nodo tiene el atributo especificado, se puede recuperar la información de dicho atributo mediante la función getAttribute(nombre_atributo).

lista = nodos[0].getElementsByTagName("codigo_referencia")
for nodo in lista:
if nodo.hasAttribute("fecha"):
print nodo.getAttribute("fecha")

Creación de árbol DOM

Para poder crear un árbol DOM vacío se utiliza la función minidom.getDOMImplementation(), la cual devuelve un objeto DOMImplementation. A continuación se llama a la función createDocument(qualifiedName, publicId, systemId) del objeto DOMImplementation para crear el documento XML. Esta función devuelve un objeto Document.

from xml.dom import minidom

# Creamos el objeto DOM.
implementacion_DOM = minidom.getDOMImplementation()

# Creamos el objeto Document.
xml_document = implementacion_DOM.createDocument(None, "Agenda_Personal", None)
raiz_documento = xml_document.documentElement

A continuación se pueden crear nodos usando la función del objeto Document denominada createElement(nombre_etiqueta). Esta función devuelve un objeto nodo. Después de crear los nodos hijos se puede empezar a construir el árbol DOM utilizando la función appendChild(información_nodo), para añadir objetos nodo como nodos hijo de otros objetos nodo.
(Puff, que lío!!! Veámoslo con el ejemplo).

datos_agenda = [["20100201","Texto en el día 01/02/2010."],
["20100215","Texto en el día 15/02/2010."],
["20100228","Texto en el día 28/02/2010."],
["20100219","Texto en el día 19/02/2010."]]

# Añadimos nodos.
for dia in datos_agenda:
# Creamos nodo.
nodo = xml_document.createElement("codigo_referencia")

# Incluimos el atributo al nodo.
nodo.setAttribute("fecha",dia[0])

# Creamos elemento.
elemento = xml_document.createElement("texto")

# Inluimos la información.
elemento.appendChild(xml_document.createTextNode(dia[1]))

# Añadimos al nodo el elemento.
nodo.appendChild(elemento)

# Añadimos el nodo a la raíz del documento.
raiz_documento.appendChild(nodo)

# Abrimos fichero en donde guardar el documento XML.
fichero = open("c:\\python\\agenda.xml", "w")

# Escribimos mediante el método writexml en la cabecera la codificación
#'iso-8859-1', para no tener problemas con tildes y demás.
# Aparecerá así:
# <?xml version="1.0" encoding="iso-8859-1"?>
xml_document.writexml(fichero, encoding='iso-8859-1')

# Finalmente cerramos el fichero.
fichero.close()

3 comentarios:

  1. Graciiiiasssss, eso era justo lo que necesitaba, si consigo por hay menejo de datos dinamicos seria mucho.
    Listas. pilas colas, etc.
    Pero gracias esta super claro.

    ResponderEliminar
  2. me da un error en estas lineas:

    datos_agenda = [["20100201","Texto en el día 01/02/2010."],
    ["20100215","Texto en el día 15/02/2010."],
    ["20100228","Texto en el día 28/02/2010."],
    ["20100219","Texto en el día 19/02/2010."]]
    ahora voy a intentar agregarlos uno por uno.. Si tenes Info de python 3.1 me podes contactar a aprettiln@gmail.com , necesito aprender rapido para hacer unos monitores para una empresa.. gracias.. saludos!

    ResponderEliminar
  3. graciass por explicar el codigoo me corrio perfecto graciass ya entendi mucho mejor xml

    ResponderEliminar