23 de mayo de 2016

57. Ficheros XML con Python.

Introducción a XML

Para saber más: http://www.w3schools.com/xml/default.asp

¿Qué es XML?

XML es una herramienta de software (y hardware) para guardar y transportar datos. Hoy en día, por su difusión en muchos sistemas, es importante conocerla para cualquier desarrollador de software. Es recomendable saber algo de HTML y Javascript antes de aprender a usar XML.
XML significa Lenguaje de Marcado Extensible (EXtensible Markup Language). Es un lenguaje de marcado como HTML. Recomienda su uso el W3C y se diseñó tanto para que las máquinas como las personas pudieran entender fácilmente la información que contienen.
Imagina que Antonio quiera enviar una nota a Maricarmen. La nota podría ser así:
Para: Maricarmen
De: Antonio
Asunto: Recordatorio
Cuerpo: ¡Oye! ¡Te recuerdo que tienes dentista el Jueves a las seis y media!
Esta información, formateada de la siguiente forma, sigue un estándar XML, que no es más que darle un formato, empaquetarla y etiquetarla. Un fichero XML no son instrucciones, no hace nada, simplemente es información.
<nota>
   <para>Maricarmen</para>
   <de>Antonio</de>
   <asunto>Recordatorio</asunto>
   <cuerpo>¡Oye! ¡Te recuerdo que tienes dentista el Jueves a las seis y media!</cuerpo>
 </nota>

Diferencias con HTML

Uno de los primeros lenguajes de marcado desarrollados, básico todavía hoy en día para el diseño de páginas web, es el HTML (Lenguaje de marcado de hipertexto). ¿Qué diferencias hay entre este lenguaje y XML?
  1. HTML trabaja con etiquetas predefinidas (<a>,<b>,<h1>,<table>,etc.) y XML no tiene etiquetado predefinido. En XML hay que definir las etiquetas y su estructura.
  2. HTML se centra en el desarrollo de páginas web, sobre todo en el contenido y su apariencia.
  3. XML se centra en el almacenamiento y transporte de datos.

XML es extensible

Un mismo documento XML puede extenderse en información por la adición de nuevas etiquetas. por ejemplo, en la nota anterior podría añadirse la etiqueta <día></día> y <hora></hora>. Programas antiguos que se desarrollaron para la versión antigua podrían seguir leyendo la información nueva simplemente ignorando las nuevas etiquetas.

XML simplifica las cosas

XML simplifica el almacenamiento de datos, su transporte, el cambio de plataformas (Windows, Linux, Macs) y la disponibilidad de los datos. Supone usar una forma común de comunicar datos entre los programas, evitando la conversión entre formatos. Facilita mucho que nuevos sistemas operativos (o nuevas versiones), nuevos programas o nuevas aplicaciones web puedan manejar los datos almacenados previamente, y no sólo ordenadores, sino incluso lo entienden las personas directamente o máquinas de lectura para ciegos, dispositivos móviles, etc.
 

XML tiene forma de árbol

Todos los documentos XML tienen una estructura de árbol. Empiezan con una etiqueta que es el "tronco" , a la que se le añaden subetiquetas, formándose "ramas", que acabn en las últimas etiquetas que serían como las "hojas".
En el siguiente ejemplo puedo definir los libros que hay en una biblioteca:
DOM node tree
  • os datos se empiezan a estructurar con una etiqueta principal, o elemento raíz (root). En nuestro ejemplo bookstore.
  • Dentro del bookstore, defino una etiqueta derivada (hija o child), llamada book. La etiqueta de la que proviene otra, se denominada etiqueta padre (parent), así que bookstore, además de ser la etiqueta raíz, es la etiqueta padre de book.
  • En este ejemplo, además, la etiqueta book tiene 4 hijos (child) que son las etiquetas title, author, year, price. Como las cuatro son hijos del mismo padre, se dice que son siblings (la palabra siblings en inglés significa hermanos o hermanas).
  • Cada etiqueta puede tener modificadores o atributos. Por ejemplo, un libro book puede pertenecer a la categoría cocina y otro a la categoría aventura. Por tanto, category es un atributo de book. Y, puede, o no, contener texto, información.
  • Además, suelen empezar con una línea donde se especifica la versión de xml usada y la codificación de los caracteres.
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
   <book category="cooking">
     <title lang="en">Everyday Italian</title>
     <author>Giada De Laurentiis</author>
     <year>2005</year>
     <price>30.00</price>
   </book>
   <book category="children">
     <title lang="en">Harry Potter</title>
     <author>J K. Rowling</author>
     <year>2005</year>
     <price>29.99</price>
   </book>
   <book category="web">
     <title lang="en">Learning XML</title>
     <author>Erik T. Ray</author>
     <year>2003</year>
     <price>39.95</price>
   </book>
 </bookstore>
 

Reglas sintácticas de XML

Las reglas que se usan en XML son sencillas, pero hay que recordarlas y seguirlas a rajatabla.
  1. Todos los documentos XML tienen que tener una etiqueta root que será el padre del resto de los elementos.
  2. El prólogo (<?xml version="1.0" encoding="UTF-8"?>) es opcional, pero si se inserta, se escribe al principio del todo. Aunque la codificación puede cambiar, es habitual guardar los documentos XML en UTF-8 y especificar dicha codificación en el prólogo. Además, UTF-8 es la codificación usada por defecto en HTML5, CSS, JavaScript, PHP, and SQL (lenguajes usados en la web).
  3. En HTML, aunque no se recomienda, las etiquetas sin cerrar pueden funcionar <p>Esto es un párrafo... Pero en XML hay que cerrar una etiqueta abierta. La única excepción es la etiqueta prólogo (que, en el fondo, no pertenece a la estructura de datos del documento).
  4. XML es "case sensitive", es decir, que las minúsculas y mayúsculas importan. Así las etiquetas <Coche> y <coche> son distintas. Entonces...
    • <Coche>Audi A8</coche> está mal.
    • <Coche>Peugeot 308</Coche> está bien.
  5. Todos los elementos tienen que estar bien anidados. Primero hay que cerrar los hijos, y después los padres.
    • <receta><ingrediente>Manzanas</ingrediente></receta> estaría bien.
    • <receta><ingrediente>Manzanas</receta></ingrediente> estaría mal.
  6. Los atributos deben estar entrecomillados
    • <book category=cocina> estaría mal
    • <book category="cocina"> estaría bien.
  7. Caracteres especiales. Por ejemplo, si quisiera escribir como un dato: el partido entre el Betis y el Sevilla quedó <0-0> tendría un problema. Los caracteres "<" y ">" están reservados en XML para abrir y cerrar etiquetas, así que la información <0-0> produciría un error. Tengo dos opciones: o evitar esos caracteres, o usar su codificación de entidad (entity references). En XML se usan 5, que son:  &lt; < , &gt; >, &amp;  &, &apos; ' ,&quot;  " , referidas al "menor que", "mayor que", "símbolo Y", "apóstrofe" y "comillas dobles".
    • En el ejemplo, debería escribir : el partido entre el Betis y el Sevilla quedó  &lt; 0-0 &gt;
  8. Comentarios, como en HTML, <!-- Este es un comentario -->
  9. Los espacios en blanco entre palabras se conservan (en HTML no):  Hola          caracola
  10. El código de final de línea es LF (salto de línea), exactamente igual que en los sistemas Linux.
  11. Se dice que el fichero XML está bien formateado "Well-formed" y no presenta errores cuando cumple todas estas reglas.

Tipos de elementos XML, Atributos y Namespaces

XML Elementos

  • Un elemento es todo aquello contenido entre dos etiquetas <precio>32€</precio>
  • Un elemento puede contener: textos, atributos, u otro elementos; o una mezcla de todo ello.
  • Pueden existir elementos vacíos (que no contengan nada) como: <elemento></elemento>. También pueden escribirse como <elemento />
  • Los elementos son sensibles a las mayúsculas y minúsculas, deben empezar por una letra o un subrayado bajo (_), una etiqueta no puede empezar con las letras "Xml" ó "xml", y no deben contener espacios. Evita, para no tener mala interpretaciones con algún software, los caracteres ".","-",":" y las letras con acento o la ñ.
  • Recuerda, que los elementos son extensibles. Pueden añadirse más elementos hijos.
= = =

XML Atributos

  • Son informaciones relativas a un elemento, como por ejemplo <persona genero="femenino">. También es posible usar las comillas simples <persona genero='femenino'>
  • Ejemplo si tengo un atributo cuyo valor contiene los caracteres comillas dobles en su interior: <gangster name='George "Shotgun" Ziegler'> De separador se usa la comilla simple; o si es necesario, al revés: <gangster name="George 'Shotgun' Ziegler", y en todo caso se puede usar las referencias a entidades &lt;  &gt;  &amp; &apos;  &quot;
  • Ejemplo de poner la misma información de tres formas (las tres son equivalentes):
<note date="2008-01-10">
  <to>Tove</to>
  <from>Jani</from>
</note>
<note>
  <date>2008-01-10</date>
  <to>Tove</to>
  <from>Jani</from>
</note>
<note>
  <date>
    <year>2008</year>
    <month>01</month>
    <day>10</day>
  </date>
  <to>Tove</to>
  <from>Jani</from>
</note>
  • No conviene abusar de los atributos. No poner demasiados, ya que no son expandibles, mo pueden contener datos múltiples y no tienen estructura de árbol. Es mejor incluir más etiquetas. Por tanto, evitar cosas como:
<note day="10" month="01" year="2008"
 to="Tove" from="Jani" heading="Reminder"
 body="Don't forget me this weekend!">
 </note>
  • Es buena idea usar "metadatos" (datos de los datos). Por ejemplo, una identificación (o id), para localizar rápidamente los datos. En este caso sí deberían ser atributos.
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>
= = =

XML Namespaces

  • A veces, usando XML puedo entrar en conflictos. Por ejemplo, el primer trozo de información se refiere a una tabla de datos HTML (filas y columnas) y el segundo a una mesa (table en inglés).
<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>
<table>
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>
  • Si uso en el mismo fichero XML ambas informaciones, puedo entrar en un conflicto, ya que el elemento <table> tiene hijos distintos. Para evitar el conflicto, puedo usar un prefijo. Por ejemplo, uso el prefijo h y f en el ejemplo siguiente; así puedo usar la información sobre mesas y tablas HTML.
<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table> 
  • Ahora viene lo importante: cuando uso prefijos en XML debo usar Namespaces (espacios con nombre). Se definen mediante un URI (Uniform Resource Identifier - Identificador uniforme de recurso) con el atributo xmlns, usando la nomenclatura xmlns:prefix="URI". Mejor verlo con un ejemplo (la segunda forma también es válida):
<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table xmlns:f="http://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root> 
<root 
xmlns:h="http://www.w3.org/TR/html4/"
 xmlns:f="http://www.w3schools.com/furniture">

 <h:table>
   <h:tr>
     <h:td>Apples</h:td>
     <h:td>Bananas</h:td>
   </h:tr>
 </h:table>

 <f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
 </f:table>

 </root>
  • Cuando asigno atributos xmlns, adjudico nombres restringidos a los prefijos. El propósito del URI del Namespace no es servir para buscar información; simplemente para asegurarnos de que el namespace es único. Pero a veces se aprovecha el URI para apuntar a una web que muestra información adicional.
= = =

Namespaces por defecto (Default Namespaces)

  • También se puede usar un xmlns por defecto, y no usar prefijos.
<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

<table xmlns="http://www.w3schools.com/furniture">
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table> 
 

Otros aspectos de los ficheros XML

  • Los navegadores suelen mostrar la información de los ficheros XLM en forma de árbol, con signos de menos (-) o (más) para expandir los nodos.
XML
  • XML puede formatearse con ficheros CSS (hojas de estilo en cascada, aunque en la web suelen leerse desde Javascript).
  • Los ficheros XML erróneos darán lugar a salidas parcialmente incorrectas o a mensajes de error.
  • Se usa el lenguaje de transformación XSLT para transformar un fichero XML en uno HTML para mostrar los datos en la WEB. (http://www.w3schools.com/xsl/default.asp)
  • Y se suele usar con el lenguaje XPath para encontrar información en un fichero XML (http://www.w3schools.com/xsl/xpath_intro.asp)
  • Hay otras aplicaciones como XLink, XPointer, para el uso de hipertexto. Se usa XML DTD o XML Schema para validar los datos, confrontarlos con una plantilla de datos y asegurarse de que se ajustan a ellas.
  • Los ficheros XML se pueden generar con PHP o ASP (¡o con Pyhton) directamente desde una aplicación o un servidor.
  • XML DOM (http://www.w3schools.com/xml/dom_intro.asp) es una forma estandarizada de añadir, borrar, obtener o cambiar elementos de un objeto XML. En él se define los objetos, métodos y propiedades de todos los elementos XML. Es una interfaz independiente de la plataforma y del lenguaje de programación.

No hay comentarios:

Publicar un comentario