Python R2


Agregar un Nodo a un XML

Para agregar un nodo a un XML es simple solo tendremos que seguir en siguiente algoritmo.

  • Crear un nodo elemento
  • Crear un nodo texto (si lo requiere)
  • Agregarle el nodo texto al nodo elemento creado
  • Agregar el nodo elemento creado a algún nodo del documento xml

Observemos en el siguiente ejemplo como lo hace

#!/usr/bin/python
# Nombre : xml3.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:
        if contacto.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
            nodo = xmldoc.createElement("ElemntoAgrgado")
            nodo.appendChild(xmldoc.createTextNode("Agregue un textnode"))
            contacto.appendChild(nodo)
        for registro in contacto.childNodes:
            if registro.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
                print registro.nodeName ,"-" , registro.firstChild.data
                registro.firstChild.data =  registro.firstChild.data

fp = open("./xml2.xml", 'w')

xmldoc.writexml(fp)
fp.close()

Crea el nodo elemento por medio del método “createElement” y luego le agrega el nodo texto, creado por medio de “createTextNode”, con el método “appendChild”. Y por último también con el metodo appendChild lo agrega al nodo contacto del documento.
Para guardar los cambios crea un archivo y lo guarda por medio del método “writexml”

Gracias a la aclaracion de Alejandro J. Cura decidi rearmar el ejemplo anterior con la libreria «elementtree».

#!/usr/bin/python
# Nombre : xml4.py
from elementtree.ElementTree import  SubElement
from elementtree import ElementTree

xmlFp = open("xml1.xml", "r")
xmldoc = ElementTree.parse(xmlFp)
agenda = xmldoc.getroot()

print dir(agenda)
print agenda.text
for c in agenda.getiterator("contacto"):
    nodo = SubElement(c, "ElemntoAgrgado")
    nodo.text = "Agregue un textnode"
    for registro in c.getiterator():
        if registro != c:print registro.tag ,"-", registro.text

xmldoc.write(file="./xml2.xml")

Gracias Alejandro.
y todas sus ideas son bien recibidas!!!!!!!!!!!

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.