1. Introducción a XML
Aunque hoy JSON es el estándar, en el mundo de Java hay mucho código heredado (legacy), por lo que a veces puedes encontrarte con XML. Así que tener una idea de qué es resulta útil. XML (eXtensible Markup Language) es un formato de texto para almacenar e intercambiar datos estructurados. Se utiliza a menudo para configuraciones, intercambio entre programas, almacenamiento de datos e incluso para la serialización de objetos.
Elementos básicos de la estructura de un documento XML:
Etiquetas (elementos):
Todo lo que va entre < y >. Cada etiqueta se abre (<tag>) y se cierra (</tag>), o es autoconclusiva (<tag/>).
Atributos:
Parámetros adicionales dentro de la etiqueta.
Ejemplo: <user name="Vasya" age="25"/>
Nodos de texto:
Texto entre etiquetas.
Ejemplo: <greeting>¡Hola, mundo!</greeting>
Ejemplo de un documento XML sencillo
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user name="Vasya" age="25">¡Hola!</user>
<user name="Katya" age="30"/>
</users>
Aquí:
- <users> — elemento raíz.
- <user> — elemento con los atributos name y age; el primer usuario tiene contenido de texto.
2. Conceptos clave
Prólogo:
La línea al principio del archivo indica la versión de XML y la codificación.
Ejemplo: <?xml version="1.0" encoding="UTF-8"?>
Elementos:
Los bloques de construcción principales de XML.
Ejemplo: <book>...</book>
Atributos:
Parámetros dentro de la etiqueta de apertura.
Ejemplo: <book title="Java" author="Ivanov"/>
Comentarios:
Como en HTML, se escriben entre <!-- ... -->.
Ejemplo: <!-- Este es un comentario -->
Secciones CDATA:
Permiten insertar texto que no se interpretará como XML (por ejemplo, con símbolos <, &, etc.).
Ejemplo:
<script><![CDATA[
if (a < b && b > 0) { ... }
]]></script>
3. Por qué se necesitan los namespaces (espacios de nombres) en XML
Problema: conflicto de nombres
En documentos XML grandes a menudo aparecen nombres de etiquetas iguales pero con distinto significado. Por ejemplo, tienes <table> como parte de HTML y <table> como parte de tu lógica de negocio (por ejemplo, una base de datos). ¿Cómo saber qué etiqueta significa qué?
Sin namespace:
<root>
<table>
<row>...</row>
</table>
<table>
<column>...</column>
</table>
</root>
Aquí no está claro a qué corresponde cada <table>.
Solución: namespaces
Namespace (espacio de nombres) es una forma de “marcar” elementos y atributos para evitar conflictos de nombres y separar con claridad el significado de las distintas etiquetas.
- Cada namespace es un URI único (suele parecer un enlace, pero es solo un identificador).
- Elementos y atributos con distintos namespaces se consideran diferentes, incluso si el nombre coincide.
Ventajas:
- No hay conflictos de nombres entre distintos estándares y esquemas.
- Se pueden combinar datos de distintas fuentes en un mismo documento.
- Se ve claramente a qué “vocabulario” pertenece cada etiqueta.
4. Uso de namespaces: declaración y aplicación
Cómo declarar un namespace
En la etiqueta de apertura de un elemento se escribe el atributo especial xmlns (XML Namespace):
- Sin prefijo: xmlns="URI" — declara el espacio de nombres por defecto para todos los elementos anidados.
- Con prefijo: xmlns:prefix="URI" — declara un espacio de nombres con un nombre corto (prefijo) que se utiliza para las etiquetas.
Ejemplo de declaración y uso de namespaces
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Celda 1</h:td>
<h:td>Celda 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Mesa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Aquí:
- xmlns:h="..." — declara el prefijo h para la tabla HTML.
- xmlns:f="..." — declara el prefijo f para los muebles.
- <h:table> y <f:table> — ahora son elementos distintos, incluso si el nombre es el mismo.
Cómo usar un namespace
- Declaración: En el elemento raíz o en cualquier otro: xmlns:prefix="URI"
- Uso: Antes del nombre del elemento o del atributo se escribe el prefijo y dos puntos: <prefix:element>...</prefix:element>
Namespace por defecto
Si se declara simplemente xmlns="URI", todos los elementos sin prefijo pertenecerán a ese namespace.
<books xmlns="http://example.com/books">
<book>...</book>
</books>
5. Práctica: crear un documento XML sencillo con varios namespaces
Vamos a crear un ejemplo de documento XML en el que se usan dos espacios de nombres: uno para HTML y otro para muebles.
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Celda 1</h:td>
<h:td>Celda 2</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>Mesa</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
Qué ocurre aquí:
- En el elemento raíz se declaran dos namespaces: h y f.
- Todos los elementos con el prefijo h: pertenecen a la tabla HTML.
- Todos los elementos con el prefijo f: pertenecen a los muebles.
6. Errores típicos
Error 1: se olvidó declarar el prefijo
<root>
<h:table>...</h:table>
</root>
Resultado: El analizador XML dará un error: The prefix 'h' for element 'h:table' is not bound.
Error 2: nombres iguales sin namespace
<root>
<table>...</table>
<table>...</table>
</root>
Resultado: No es posible distinguir a qué <table> corresponde cada una.
Error 3: uso incorrecto del prefijo
<root xmlns:h="http://www.w3.org/TR/html4/">
<h:table>...</h:table>
<f:table>...</f:table> <!-- Error: el prefijo f no está declarado -->
</root>
Resultado: Error del analizador: The prefix 'f' for element 'f:table' is not bound.
GO TO FULL VERSION