Element Tree
Element Tree
Procesamiento XML
Laboratorio IPC2
Qué es DOM?
El DOM se originó como una especificación para permitir que los programas
Java y los scripts de JavaScript fueran portables entre los navegadores web.
La primera especificación del modelo surgió en 1997 llamada DOM Level 1 del
cual se realizó una actualización en el año 2000.
Los atributos en el modelo DOM también pueden ser tratados como nodos en
vez de strings aunque es bastante inusual hacerlo.
Objetos en el modelo DOM
MiniDOM
Este modelo usa la función “parse” para crear un objeto DOM directamente
desde nuestro archivo XML. La función tiene la siguiente sintaxis:
La propiedad “file_or_filename” debe contener una ruta hacia el archivo XML o
hacia un objeto de tipo archivo. Esta función retorna un documento el cual ya
podremos procesar como un XML.
Debido a que cada nodo se trata como un objeto, podemos acceder a los
valores de los tags usando las propiedades del objeto.
Para obtener los nodos con el tag “item” utilizamos el comando “getElementsByTagName”.
Podemos obtener los valores de los atributos del tag de la siguiente manera:
Para imprimir todos los valores posibles de los atributos podemos usar instrucciones
cíclicas.
Lo cual nos dará el siguiente resultado:
Para obtener los valores dentro del tag tenemos dos opciones. Utilizar el comando “firstChild” o
utilizar childNodes[x] donde x es el índice. Usualmente este índice será 0.
Es otra alternativa simple para procesar archivos XML que se puede utilizar en Python.
Igual que en MiniDOM, debemos primero importar la librería para utilizar el módulo.
Al utilizar Element Tree, se crea una estructura en forma de árbol utilizando el comando
“parse” y se obtiene un elemento raíz. Una vez identificado este elemento, ya podremos
recorrer el árbol debido a que todos los nodos del árbol están conectados.
En este caso, con el Element Tree no lo utilizaremos cadenas para buscar los tags
específicos, sino que utilizaremos una notación en la que especificamos índices de
subárboles y posiciones dentro de sus nodos.
Donde X es el índice del nodo padre que buscamos y Y será el índice del subnodo.
Para buscar un elemento en especial:
Para obtener todos los valores de cierto atributo también utilizamos instrucciones cíclicas con la
característica de que utilizamos los identificadores root para la raíz, element para los atributos
en tags y subelement para los valores.
Y obtenemos el siguiente resultado:
Y el resultado será:
CONTANDO ELEMENTOS DE UN DOCUMENTO
XML (USANDO DOM)
Del mismo modo, el ElementTree módulo nos permite calcular la cantidad de nodos conectados
a un nodo.
ESCRIBIR DOCUMENTOS XML(ElementTree)
ElementTree también es ideal para escribir datos en archivos XML. El siguiente código muestra cómo
crear un archivo XML con la misma estructura que el archivo que usamos en los ejemplos anteriores.
3. Aunque podemos agregar nuestros atributos con la SubElement función, también podemos
usar la set()función, como hacemos en el siguiente código. El texto del elemento se crea con la
propiedad text del Elemento objeto.
4. En las últimas 3 líneas del código siguiente, creamos una cadena a partir del árbol XML y escribimos
esos datos en un archivo que abrimos.
La ejecución de este código dará como resultado un nuevo archivo, "items2.xml", que debería ser
equivalente al archivo "items.xml" original, al menos en términos de la estructura de datos XML.
Probablemente notará que la cadena resultante es solo una línea y no contiene sangría,
ENCONTRAR ELEMENTOS EN XML
Sintaxis:
Para ambas funciones, el match parámetro puede ser un nombre de etiqueta XML o una ruta. La
función findall() devuelve una lista de elementos y find devuelve un solo objeto de tipo Element.
se recorren todos los elementos de l root y todos los subElementos ‘item’
1. Obtenemos el dict de cada elemento para obtener el nombre del atributo en este caso
‘name’
2. Obtenemos únicamente el nombre de cada elemento si ya conocemos el atributo
nombrado ‘name’
MODIFICAR UN ELEMENTO
El ElementTree módulo presenta varias herramientas para modificar documentos XML existentes. El
siguiente ejemplo muestra cómo cambiar el nombre de un nodo, cambiar el nombre de un atributo y
modificar su valor, y cómo agregar un atributo adicional a un elemento.
El texto de un nodo se puede cambiar especificando el nuevo valor en el campo de texto del objeto de
nodo. El nombre del atributo se puede redefinir utilizando la set(name, value)función. La set función no
tiene que trabajar solo en un atributo existente, también se puede usar para definir un nuevo atributo.
ELIMINAR UN ELEMENTO XML
Un subelemento específico se puede eliminar usando la remove función. Esta función debe
especificar el nodo que queremos eliminar.
ELIMINAR TODOS LOS ELEMENTOS
El ElementTree módulo nos presenta la clear() función, que se puede usar para eliminar todos los
subelementos de un elemento dado.