¿Qué es XML?
XML son las siglas de Extensible Markup Language (Lenguaje de Marcado Extensible), un lenguaje de marcado diseñado para almacenar, transportar y estructurar datos en un formato legible por humanos y analizable por máquinas. XML fue definido por el W3C en 1998 (XML 1.0) y actualizado en 2004 (XML 1.1). A diferencia de HTML, que define un conjunto fijo de etiquetas, XML permite a los autores definir sus propias etiquetas — lo "extensible" del nombre.
XML fue el formato dominante de intercambio de datos para servicios web desde finales de los años 90 hasta finales de los 2000, cuando la simplicidad de JSON lo fue desplazando para la mayoría de los casos de uso de API. Sin embargo, XML sigue siendo esencial en muchos dominios: Microsoft Office (DOCX, XLSX, PPTX), gráficos SVG, feeds RSS/Atom, XHTML, servicios web SOAP, layouts de Android, configuraciones de compilación Maven/Gradle e incontables sistemas de integración empresarial.
Sintaxis Principal
Un documento XML bien formado:
<?xml version="1.0" encoding="UTF-8"?>
<libreria>
<libro categoria="ficcion" isbn="978-84-339-6827-2">
<titulo lang="es">Cien Años de Soledad</titulo>
<autor>Gabriel García Márquez</autor>
<anio>1967</anio>
<precio moneda="EUR">12.99</precio>
</libro>
<libro categoria="ciencia">
<titulo lang="es">Historia del Tiempo</titulo>
<autor>Stephen Hawking</autor>
<anio>1988</anio>
<precio moneda="EUR">14.99</precio>
</libro>
</libreria>
Conceptos clave:
Elementos: Etiquetas que envuelven contenido. Toda etiqueta de inicio debe tener una etiqueta de cierre correspondiente, o usar la forma de cierre automático: <br/>.
Atributos: Pares nombre-valor dentro de una etiqueta de inicio. Los valores de atributo deben estar entre comillas.
Elemento raíz: Todo documento XML debe tener exactamente un elemento raíz que contenga todos los demás.
Declaración XML: El <?xml version="1.0" encoding="UTF-8"?> opcional al principio. Especificar encoding="UTF-8" es muy recomendable.
Secciones CDATA: <![CDATA[contenido con <etiquetas> que no se analizarán]]> — para contenido literal que no debe interpretarse como marcado.
XML Bien Formado frente a XML Válido
XML distingue dos niveles de corrección:
Bien formado — XML sintácticamente correcto:
- Tiene exactamente un elemento raíz
- Todas las etiquetas están correctamente anidadas (sin solapamientos)
- Todos los elementos están cerrados
- Los valores de atributo están entre comillas
- Los caracteres reservados (
<,>,&,",') en el contenido están escapados como entidades
Válido — bien formado Y conforme a un esquema:
- DTD (Definición de Tipo de Documento): El lenguaje de esquema XML original
- XSD (Definición de Esquema XML): El lenguaje de esquema estándar, admite tipos de datos y restricciones complejas
- RELAX NG: Un lenguaje de esquema más simple
Espacios de Nombres
Los Espacios de Nombres XML (xmlns) resuelven el problema de las colisiones de nombres al combinar vocabularios XML de diferentes fuentes:
<root xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg">
<h:div>
<svg:svg width="100" height="100">
<svg:circle cx="50" cy="50" r="40" fill="red"/>
</svg:svg>
</h:div>
</root>
La URI del espacio de nombres es solo un identificador — no necesita apuntar a un recurso real. Los prefijos (h:, svg:) son alias para las URIs del espacio de nombres y son locales a cada documento.
XPath y Consulta de XML
XPath es el lenguaje de consulta estándar para seleccionar nodos en un documento XML:
/libreria/libro[@categoria='ficcion'] — Todos los libros de ficción
//libro/titulo — Todos los elementos título en cualquier lugar
/libreria/libro[precio > 13]/titulo — Libros que cuestan más de 13€
count(//libro) — Número de libros
XSLT (Transformaciones del Lenguaje de Hoja de Estilos Extensible) transforma XML en otro XML, HTML o texto usando reglas de plantilla.
Entidades de Caracteres
Cinco entidades XML predefinidas manejan los caracteres reservados en el contenido:
| Carácter | Entidad | Caso de uso |
|---|---|---|
< |
< |
Signo menor que en contenido de texto |
> |
> |
Signo mayor que (opcional) |
& |
& |
Ampersand en contenido de texto |
" |
" |
Comilla doble en valores de atributo |
' |
' |
Comilla simple en valores de atributo |
Formatos Basados en XML
XML sirve como base para muchos formatos especializados:
- SVG (Scalable Vector Graphics) — imágenes vectoriales
- XHTML — HTML reformulado como XML bien formado
- RSS/Atom — sindicación de feeds web
- SOAP — Protocolo de Acceso a Objetos Simples para servicios web
- DOCX/XLSX/PPTX — Office Open XML (contenedores ZIP de XML)
- ODT/ODS/ODP — OpenDocument Format
- Layout XML de Android — definiciones de interfaz de usuario para apps Android
- Maven POM — configuración de compilación de proyectos Java (
pom.xml) - KML/GML — formatos de datos geográficos
XML frente a JSON: Cuándo Usar Cada Uno
| Escenario | Mejor opción | Razón |
|---|---|---|
| Respuesta de API REST | JSON | Más simple, ligero y rápido |
| Datos centrados en documentos | XML | Contenido mixto, instrucciones de procesamiento |
| Ecosistema SOAP existente | XML | El protocolo lo requiere |
| Validación de esquema compleja | XML (XSD) | Más expresivo que JSON Schema |
| Gráficos SVG | XML | El formato lo requiere |
| Mezcla de espacios de nombres | XML | Soporte de espacio de nombres incorporado |
| Archivos de configuración (editados por humanos) | YAML o TOML | Más legibles |
Análisis de XML
Python (ElementTree y lxml):
import xml.etree.ElementTree as ET
tree = ET.parse('libros.xml')
root = tree.getroot()
for libro in root.findall('libro'):
titulo = libro.find('titulo').text
precio = float(libro.find('precio').text)
print(f"{titulo}: {precio}€")
# XPath con lxml
from lxml import etree
doc = etree.parse('libros.xml')
ficcion = doc.xpath("//libro[@categoria='ficcion']/titulo/text()")
Conversión de XML
XML → JSON: Múltiples enfoques — xmltodict (Python) convierte cada elemento en un objeto. Ten en cuenta que el modelo de contenido mixto de XML (elementos + texto intercalados) no se mapea limpiamente a JSON.
XML → CSV: Solo práctico para estructuras XML planas y repetitivas. XSLT para producir texto CSV, o análisis + aplanamiento en Python/Java.
Resumen
XML es el estadista veterano de los formatos de datos estructurados — verboso, potente y ubicuo en sistemas empresariales, estándares de documentos y tecnologías web. Su soporte de espacios de nombres, maduros lenguajes de esquema (XSD, RELAX NG, Schematron), rico ecosistema de consultas (XPath, XQuery, XSLT) y capacidad para mezclar texto con marcado lo hacen particularmente adecuado para escenarios centrados en documentos e integración. JSON ha desplazado a XML para la mayoría de los casos de uso de APIs REST debido a su simplicidad, pero la profundidad y el ecosistema de XML garantizan que seguirá siendo una tecnología fundamental en la informática durante décadas.
Conversiones relacionadas
Conversiones de documento que siguen este tema: