XML

Adolfo Sanz De Diego

Octubre 2017

1 Acerca de

1.1 Autor

1.2 Licencia

1.3 Fuente

2 Introducción a XML

2.1 ¿Qué es?

  • XML (Extensible Markup Language) es un metalenguaje que permite definir lenguajes de marcado.

  • Los lenguajes de marcado permiten describir la estructura de los contenidos de un documento.

2.2 Etiquetas

  • Un lenguaje de marcado está formado por un conjunto de etiquetas que se encierran entre corchetes angulares, <>, y se usan en pares.

  • Cada par de etiquetas delimita el comienzo y el final de una porción de documento a la que se refiere la etiqueta. Por ejemplo:

<asignatura>Bases de datos</asignatura>

2.3 Ejemplo XML

Ejemplo XML
Ejemplo XML

2.4 Ventajas

  • Permite que la información esté autodocumentada.

  • Formato no rígido pues dispone de la capacidad de reconocer e ignorar nuevas etiquetas.

  • Las etiquetas pueden aparecer varias veces facilitando la representación de atributos multivaluados.

  • Permite el anidamiento de etiquetas.

2.5 Ejemplo API

3 Estructura básica

3.2 Elementos

  • Es un par de etiquetas de comienzo y final coincidentes que delimita una porción de información.
<título>introducción</título>

3.3 Elementos vacíos

  • Existen elementos vacíos que no contienen contenido.
<Nombre etiqueta/>
<Nombre etiqueta></Nombre etiqueta>

3.4 Elementos anidados

  • Los elementos se pueden anidar:

    • Un texto aparece en el contexto de un elemento si aparece entre la etiqueta de inicio y final de dicho elemento.

    • Las etiquetas se anidan correctamente si toda etiqueta de inicio tiene un única etiqueta de finalización coincidente que está en el contexto del mismo elemento padre.

  • Un elemento puede aparecer varias veces en un documento XML.

3.5 Ejemplo anidado

Elementos anidados
Elementos anidados

3.6 Atributos

  • Las etiquetas de los elementos pueden incluir 1 o más atributos que representan propiedades de los elementos de la forma Nombre atributo="Valor atributo"
<cuenta tipo_cuenta="corriente">
  • Los atributos pueden aparecer solamente una vez en una etiqueta dada.

3.7 Mezcla

  • El texto en un documento XML puede estar mezclado con los subelementos de otro elemento.
Mezcla texto con subelementos
Mezcla texto con subelementos

3.8 Raíz

  • Todo documento XML tiene un único elemento raíz que engloba al resto de elementos del documento.

  • En el primer ejemplo el elemento era la raíz.

3.9 Comentarios

  • Es un texto que se escribe entre <!–- y -->

  • La cadena "--" no puede aparecer dentro de un comentario.

  • Los comentarios pueden aparecer en cualquier sitio salvo dentro de declaraciones, etiquetas y dentro de otros comentarios.

3.10 Espacio de nombres

  • Es un mecanismo que permite especificar nombre únicos globalmente para que se usen como marcas de elementos en los documentos XML.

  • Para ello se antepone a la etiqueta o atributo un identificador de recursos universal. En el ejemplo del banco podría ser http:///www.BancoPrincipal.com

  • Para abreviarlo se declaran abreviaturas del espacio de nombres mediante el atributo xmlns

3.11 Ejemplos espacio de nombres

Ejemplo espacio de nombres
Ejemplo espacio de nombres

3.12 Varios espacios de nombres

  • Un documento puede tener más de un espacio de nombres declarado como parte del elemento raíz, de manera que se puede asociar elementos diferentes con espacios de nombres distintos.

3.13 Espacio de nombre predeterminado

  • Se puede definir un espacio de nombres predeterminado mediante el uso del atributo xmlns en el elemento raíz.

  • Los elementos sin un prefijo de espacio de nombres explícito pertenecen entonces al espacio de nombres predeterminado.

3.14 CDATA

  • A veces es necesario almacenar valores que contienen etiquetas sin que se interpreten como etiquetas XML, es decir como texto normal. Para ello se usa la construcción:
<![CDATA]<cuenta></cuenta>]]>

4 Procesamiento de XML

4.1 Ejemplo

  • Se va a considerar el siguiente documento XML de ejemplo para ilustrar las diferentes técnicas de procesamiento.
Ejemplo procesamiento
Ejemplo procesamiento

4.2 ElementTree

  • ElementTree es una librería estándar para procesar y crear documentos XML que crea un árbol de objetos.

  • El árbol generado esta formado por objetos "elemento" de tipo Element donde cada uno de ellos dispone de un conjunto de atributos: nombre, diccionario de atributos, valor textual y secuencia de elementos hijo.

4.3 Abrir XML

  • Para procesar un documento basta abrir el documento con el método open() como si se tratara de un fichero y usar el método parse de ElementTree.
Código abrir XML
Código abrir XML

4.4 Iterar XML

  • Si se quiere visitar todo el árbol se usa el método iter() que crea un generador que itera sobre todos los nodos del árbol.
Código iterar XML
Código iterar XML

4.5 Filtrar XML

  • Puede que se esté interesado sólo en determinados elementos del árbol, y no en todos. Para ello se pasa como parámetro del método iter() el nombre del elemento de interés.
Código filtrar XML
Código filtrar XML

4.6 Iterar desde raíz

  • Otra posibilidad de iterar sobre los elementos del árbol es acceder a la raíz del árbol y desde ella iterar sobre los hijos.
Código iterar XML desde raíz
Código iterar XML desde raíz

4.7 Acceso indexado

  • También es posible acceder a los elementos de forma indexada.
Código acceso indexado
Código acceso indexado

4.8 Buscar

  • find(): recupera el primer subelemento del elemento actual encajando con la descripción dada
  • findall(): recupera todos los subelementos del elemento actual encajando con la descripción dada
  • iterfind(): recupera todos los elementos encajando con la descripción dada.
  • text: accede al contenido textual de un elemento
  • get(atributo): accede al atributo dado del elemento.

4.9 Ejemplo findAll()

  • Se van a encontrar todos los títulos de los libros usando findall().
Código ejemplo findAll()
Código ejemplo findAll()

4.10 Uso de eventos

  • Se puede realizar un procesamiento basado en eventos usando el método iterparse():
    • Genera eventos "start" en las aperturas de elemento y eventos "end" en los cierres de elemento.
    • Además los datos pueden ser extraídos del documento durante la fase de parseo.

4.11 Ejemplo uso eventos

  • Ejemplo de parseo dirigido por eventos:
Código ejemplo interfase()
Código ejemplo interfase()

4.12 Desde cadena

  • También es posible procesar cadenas que representan un documento XML usando el método fromstring() que toma como argumento la cadena que representa el documento XML.
Código ejemplo fromstring()
Código ejemplo fromstring()

4.13 Modificar XML

  • Se puede modificar un documento XML que ha sido leído:
    • A nivel de elemento se puede cambiar el contenido cambiando el valor de Element.text, añadir o modificar atributos con el método Element.set(), y añadir nuevos hijos con el método Element.append().
    • A nivel de documento, se escribe el nuevo documento con el método ElementTree.write()

4.14 Explicar ejemplo modificar XML

  • Se va a modificar el documento XML de ejemplo:
    • Se va añadir un nuevo atributo que indica el orden.
    • Se va añadir un nuevo elemento que indica la editorial.
    • Se va añadir un nuevo atributo que indica si hay ejemplares.

4.15 Ejemplo modificar XML

Código ejemplo modificar XML
Código ejemplo modificar XML

4.16 Eliminar elementos

  • También es posible eliminar elementos con el método Element.remove().

  • Tomando como entrada la salida del ejemplo anterior se van a eliminar todos los elementos de tipo "Libro" que tengan un número de orden mayor que 3.

4.17 Ejemplo eliminar elementos

Código ejemplo eliminar elementos
Código ejemplo eliminar elementos

4.18 Crear XML

  • También es posible la creación de documentos XML desde cero. Para ello se disponen de los siguientes métodos en la clase Element:
    • Element(): Crea un elemento nuevo.
    • subElement(): Añade un nuevo elemento al padre.

4.19 Ejemplo crear XML

  • En el siguiente ejemplo se va a crear un documento XML con información de un libro semejante a los ejemplos anteriores.
Código ejemplo crear XML
Código ejemplo crear XML

4.20 Añadir atributos

  • Para añadir atributos a un elemento que se está creando basta pasar como argumento del elemento o subelemento un diccionario con los atributos expresados en forma de parejas clave-valor.

4.21 Ejemplo añadir atributos

  • Se va a modificar el código anterior para añadir atributos al elemento Libro. En concreto se va añadir el atributo isbn, orden y ejemplares.
Código ejemplo añadir atributos
Código ejemplo añadir atributos

4.22 Añadir hijos

  • Se pueden añadir múltiples hijos a un elemento mediante el método extend() que recibe como argumento algo que sea iterable tal como una lista o bien otra instancia de Element.

  • En el caso de una instancia de Element, los hijos del elemento dado se añaden como hijos del nuevo padre. Sin embargo el padre actual no es añadido.

4.23 Ejemplo añadir hijos

  • Se va a reconstruir el ejemplo anterior pero usando extend sobre una cadena dada.
Código ejemplo añadir hijos
Código ejemplo añadir hijos

4.24 Ejemplo añadir hijos con lista

  • También se podría haber construido pasando una lista.
Código ejemplo añadir hijos con lista
Código ejemplo añadir hijos con lista

4.25 Guardar XML

  • A veces interesa guardar un documento XML en un archivo. En estos casos se usará el método write() de ElementTree.

4.26 Ejemplo guardar XML

  • Se va a realizar el mismo ejemplo de antes pero ahora el resultado se almacenará en un archivo.
Código ejemplo guardar XML
Código ejemplo guardar XML

4.27 Elementos vacios

  • El método write() de ElementTree tiene un segundo argumento que sirve para controlar que se hace con elementos que son vacíos. Existen tres posibilidades según el valor de dicho argumento:
    • xml: Genera un elemento vacío con una sola etiqueta
    • html: Genera un elemento vacío con dos etiquetas.
    • text: Imprime solo elementos con contenido, el resto se los salta.

4.28 Ejemplo elementos vacios (I)

  • Siguiendo con el ejemplo anterior se va añadir un elemento vacío y se van a probar los tres argumentos.
Código ejemplo elementos vacíos I
Código ejemplo elementos vacíos I

4.29 Ejemplo elementos vacios (II)

Código ejemplo elementos vacíos II
Código ejemplo elementos vacíos II

4.30 Ejemplo elementos vacios (III)

Código ejemplo elementos vacíos III
Código ejemplo elementos vacíos III