XML: Extensible Markup Language (Lenguaje de Marcas Extensible)

Tomado del text Core Java y del capítulo 2 de este tutorial sobre J2EE.
XML es un estándar para el intercambio de información, en particular en la web. Este lenguajes usa rótulos como en HTML, pero en este contexto se conocen como marcas. A diferencia con HTML, las marcas en xml identifican los datos y no la forma como deben ser desplegados.

Introducción a XML

Es común encontrar archivos de configuración o inicialización con información del tipo (parte del archivo en /etc/X11/xorg.conf):
Section "Files"
EndSection

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "CoreKeyboard"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"
EndSection

Section "InputDevice"
Identifier "Configured Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "true"
EndSection
También del tipo:
fontname=Times Roman
fontsize=12
windowsize=400 300
color=0 50 100
Si bien el formato de xorg.conf es más flexible, en general este tipo de archivos no poseen mayor estructura para representar jerarquías de datos (abstracciones de mayor nivel). También se crean problemas cuando los nombres se repiten. Para resolver este problema podemos usar nombres más largos como en:
title.fontname=Helvetica
title.fontsize=36
body.fontname=Times Roman
body.fontsize=12
XML resuelve este problema porque permite expresar jerarquias flexiblemente. Para el último caso se vería como:
<configuration>
<title>
<font>
<name>Helvetica</name>
<size>36</size>
</font>
</title>
<body>
<font>
<name>Times Roman</name>
<size>12</size>
</font>
</body>
<windows>
<width> 400 </width>
<height> 300 </height>
</windows>
<color>
<red> 0 </red>
<green> 50 </green>
<blue> 100 </blue>
</color>
<menu>
<item> One </item>
<item> Two </item>
<item> Three </item>
</menu>
</configuration>
Esta notación permite mayor flexibilidad y dar jerarquía a los datos.

Supongamos que debemos generar un archivo de datos de salida. Si la salida es de texto, lo más común es organizar el archivo en líneas con la información en columnas usando algún tipo de separador.
 
En una aplicación donde necesitemos almacenar mensajes, en lugar de usar esquemas similares a los primeros, podemos usar:
<message>
<to>you@yourAddress.com</to>
<from>me@myAddress.com</from>
<subject>XML Is Really Cool</subject>
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
Si poseemos algún API para leer las marcas que usemos, será simple obtener las partes de nuestro mensaje en forma estructurada y sin mayor trabajo para el programador. Además conociendo las marcas usadas cualquier aplicación puede leer este archivo.

En XML los rótulos también pueden tener atributos como en:
<message to="you@yourAddress.com" from="me@myAddress.com" 
subject="XML Is Really Cool">
<text>
How many ways is XML cool? Let me count the ways...
</text>
</message>
Debido a que podemos usar rótulos o atributos, hay varias formas para diseñar la estructura del archivo. En la referencia se pueden ver recomendaciones para tal diseño.
XML exige que los archivos estén bien formados. Esto es si usamos el rótulo <message> debemos incluir el rótulo </message>. Además no podemos mezclar rótulos como en <message> .... <text> .... </message> ....</text>
Sí podemos usar un rótulo que esté solo. En ese caso usamos <rótulo/>, alternativamente podríamos haber usado <rótulo></rótulo>.
Los comentarios los ponemos con:
<!-- This is a comment -->
Archivos XML simpre parten con un prólogo que quivale a los encabezados de html. El pŕologo mínimo es:
<?xml version="1.0"?>
Esta declaración puede tener más información como en:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 

Hojas de Estilo

XML describe los datos; cuando necesitamos desplegarlos, podemos hacerlo en conjunto con hojas de estilo (stylesheet). Para esto existe un estándar, XSL Extensible Stylesheet Language, para indicar el estido de despliegue de los datos.

Document Type Definition (DTD)

La DTD define los tipos de rótulos, atributos y entidades permitidas, y puede expresar algunas limitaciones para combinarlos. Los documentos XML que se ajustan a su DTD son denominados válidos.
Ejemplo: Spongamos que tenemos un archivo xml para almacenar precios de tipos de café:
<priceList>
<coffee>
<name>Mocha Java</name>
<price>11.95</price>
</coffee>
<coffee>
<name>Sumatra</name>
<price>12.50</price>
</coffee>
</priceList>
La definición del tipo de documento podría ser:
<!ELEMENT priceList (coffee)+>
<!ELEMENT coffee (name, price) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT price (#PCDATA) >
Así queda claro que una lista de precios contiene uno o más (+) datos que cumplen con la estructura para coffee. Cada coffee a su vez queda descrito por la secuencia name y price. Finalmente tenemos que name y price son de tipo caracter (#PCDATA).