Python R2


XML en Python


XML (Extensible Markup Language): Es un meta-lenguaje que permite definir lenguajes de marcado. En la práctica es un estándar que permite a diferentes aplicaciones interactuar con facilidad.  XML fue creado con la supervisión del World Wide Web Consortium (W3C), organismo que maneja los estándares de la Web, basándose en las especificaciones del lenguaje SGML. Su desarrollo se comenzó en 1996 y la primera versión salió a la luz el 10 de febrero de 1998.

Estructura de XML

El XML consta de con 4 especificaciones:

  • DTD (Document Type Definition): Definición del tipo de documento. Es en general, un archivo que encierra una definición formal de un tipo de documento y, a la vez, especifica la estructura lógica de cada documento. El DTD del XML es opcional.
  • XSL (eXtensible Stylesheet Language): Es el lenguaje de estilo del XML. Es el que le cambia el aspecto al documento.
  • XLL (eXtensible Linking Language): Define el modo de enlace entre diferentes enlaces.
  • XUA (XML User Agent): Estandarización de navegadores XML. Todavía está en proceso de creación de borradores de trabajo.

Con el XML que trabajaremos en esta entrada es:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<agenda>
    <contacto>
        <nombre>Ariadna</nombre>
        <apellido>Bouzo</apellido>
        <numero tipo="tel">43050412</numero>
        <direccion>okla 4501</direccion>
    </contacto>
    <contacto>
        <nombre>Arturo Elias</nombre>
        <apellido>Anton</apellido>
        <numero tipo="cel">1563442356</numero>
        <direccion>pepiri 1524</direccion>
    </contacto>
    <contacto>
        <nombre>Pedro</nombre>
        <apellido>Colono</apellido>
        <numero tipo="cel">1565214578</numero>
        <direccion>av Colon 1245</direccion>
    </contacto>
    <contacto>
        <nombre>Eduardo</nombre>
        <apellido>Ramos</apellido>
        <numero tipo="tel">45213652</numero>
        <direccion>Luna 4512</direccion>
    </contacto>
    <contacto>
        <nombre>Rocio</nombre>
        <apellido>Gomez</apellido>
        <numero tipo="cel">1551253652</numero>
        <direccion>Cordoba 1254</direccion>
    </contacto>
</agenda>

Observe que si bien uno en XML puede crear sus propias tag o marcas, siempre lo tienen que escribir igual ya que XML es sensible a minúsculas y mayúsculas. Otra cosa que XML nos exige, es que cada marca que abrimos la cerremos. En otras palabras XML nos exige que el documento que armemos sea “bien formado”.
Python para el manejo de estos documentos nos facilita de un paquete “xml” y dentro del mismo estarán los parse de DOM y SAX.

DOM y SAX

DOM y SAX, son las dos herramientas  mas extendidas que sirven para analizar XML y definir la estructura de un documento, aunque existen otras. Una de las diferencias más grandes entre ellas es que las primeras verifican que el documento, además de estar bien formado de acuerdo a las reglas de XML, responda a una estructura definida en una Definición del Tipo de Documento (DTD).

Leer un XML

Para leer un XML lo primero que haremos es importar xml.dom.minidom luego obtendremos un objeto que represente nuestro documento “xml1.xml” mediante la palabra xml.dom.minidom.parse de la siguiente manera:

#!/usr/bin/python
# Nombre : xml1.py
import xml.dom.minidom
xmldoc = xml.dom.minidom.parse("./xml1.xml")

for n in xmldoc.getElementsByTagName("contacto"):
    print n.toxml()
    print n.firstChild.data

for n in xmldoc.getElementsByTagName("nombre"):
    print n.toxml()
    print n.firstChild.data

for n in xmldoc.getElementsByTagName("direccion"):
    print n.toxml()
    print n.firstChild.data

for n in xmldoc.getElementsByTagName("numero"):
    print n.toxml()
    print n.firstChild.data
    print n.getAttribute("tipo")
    print n.attributes.keys()
    print n.attributes["tipo"].value

Para leer un XML lo primero que haremos es importar xml.dom.minidom luego obtendremos un objeto que represente nuestro documento “xml1.xml” mediante la palabra xml.dom.minidom.parse de la siguiente manera
También podemos observar en este código como obtenemos los distintos nodos por medio de getElementByTagName. Este  metodo tan familiar para los programadores JavaScript  es de gran utilidad ya que nos retorna una lista con todos los nodos hijos desde el nodo donde se invoque y que coincidan con el nombre del tag. También observamos algunos métodos y propiedades como son:

  • toxml: este método nos devuelve el código XML.
  • firstChild: esta propiedad es el enlace al primer nodo hijo
  • getAttribute: obtiene el valor de una propiedad determinada del tag
  • attributes: es un diccionario de propiedades del tag

También se podría haber recorrido de esta manera

#!/usr/bin/python
# Nombre : xml2.py
import xml.dom.minidom
xmldoc = xml.dom.minidom.parse("./xml1.xml")

for n in  xmldoc.childNodes :
    print n.tagName
    for contacto in n.childNodes:
        for registro in contacto.childNodes:
            if registro.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
                print registro.nodeName ,"-" , registro.firstChild.data

Después de instanciar nuestro objeto xml lo que hacemos es recorrer todos los nodos hijos de él, y luego recorremos todos sus hijos  gracias a childNodes que no es mas que una lista con todos los nodos hijos de  un nodo padre. Luego tendremos que tener cuidado  la hora de imprimir ya que no todos son nodos de tipo element también existen los nodos de tipo text. Los nodos de tipo text son siempre los nodos hojas del árbol DOM y tienen el atributo data para recuperar su valor.

Anuncios

6 comentarios to 'XML en Python'

Subscribe to comments with RSS o TrackBack to 'XML en Python'.

  1. Santiago said,

    Pequeña Corrección: “Luego tendremos que tener CUIDADO a la hora de imprimir ya que no todos son nodos de tipo element también existen los nodos de tipo text”

  2. arturoeanton said,

    gracias Santiago hay esta corregido

  3. Eric Galicia said,

    esta chido el ejemplo, gracias 🙂

  4. olman21 said,

    Y para escribirle a un xml???

  5. Yves said,

    Pongamos que dentro de una etiqueta llamada contacto por ejemplo, hubiera un hijo con una etiqueta llamada contacto tambien. Como podria hacer para que en la consulta de dicha etiqueta no me saliera tambien el hijo?
    Es decir, si hiciera

    Ariadna

    Bouzo

    43050412
    okla 4501

    #reponse es el documeto xml
    nodos = response.childNodes
    lista = nodos[0].getElementsByTagName(“contacto”)
    for course_inf in lista:
    valueResponse = course_inf.toxml()

    Por que mostraria la del padre y la del hijo. Y se podria dar el caso que para analizar ciertas respuestas solo interesara el padre.

    Saludos y buen blog!

  6. edwight said,

    como hago para escribir un archivo xml desde python ?


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: