XML: Marcado de Datos Estructurados en Servicios Web y Documentos
XML (Extensible Markup Language, o Lenguaje de Marcado Extensible) es un lenguaje de marcado basado en texto diseñado para almacenar y transportar datos estructurados. Aunque JSON ha desplazado en gran medida a XML para las nuevas APIs web, XML sigue siendo esencial en muchos dominios críticos — incluidos los formatos de archivo que usas cada día en Microsoft Office.
Historia y Contexto
XML se convirtió en Recomendación del W3C en febrero de 1998, derivado del SGML (Standard Generalized Markup Language), un potente pero complejo sistema de marcado de documentos. XML fue diseñado para ser un formato de datos universal para la web — más sencillo que SGML pero más riguroso que HTML.
A finales de los 90 y durante la década de 2000, XML dominó:
- Servicios web: SOAP (Simple Object Access Protocol) y XML-RPC
- Configuración:
pom.xmlde Maven,applicationContext.xmlde Spring, archivos de construcción Ant - Formatos de documento: DocBook, DITA, TEI
- Intercambio de datos: Sustitutos de EDI, estándares de datos gubernamentales
Hoy en día, JSON ha reemplazado en gran medida a XML para las APIs REST y muchos archivos de configuración. Pero XML sigue siendo irremplazable en muchas áreas que fueron estandarizadas antes de que JSON madurase.
Sintaxis XML
Un documento XML sigue reglas de sintaxis estrictas:
Declaración XML (opcional, recomendada):
<?xml version="1.0" encoding="UTF-8"?>
Elementos — los bloques de construcción básicos:
<producto>
<nombre>Auriculares Inalámbricos</nombre>
<precio>79.99</precio>
</producto>
Atributos — metadatos sobre elementos:
<producto id="1001" categoria="audio">
<nombre>Auriculares Inalámbricos</nombre>
</producto>
Etiquetas de autocierre — para elementos vacíos:
<br />
<imagen src="foto.jpg" alt="Foto del producto" />
Comentarios:
<!-- Esto es un comentario -->
Secciones CDATA — para contenido que no debe ser analizado como XML:
<script><![CDATA[
if (a < b && c > d) { hacerAlgo(); }
]]></script>
Espacios de nombres — previenen conflictos entre nombres de elementos:
<raiz xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom">
<dc:title>Mi Feed</dc:title>
</raiz>
XML Bien Formado vs XML Válido
XML bien formado sigue las reglas básicas de sintaxis:
- Tiene exactamente un elemento raíz
- Todos los elementos están correctamente anidados (sin superposición)
- Todos los atributos están entre comillas
- Las etiquetas distinguen mayúsculas de minúsculas y están correctamente cerradas
- Los caracteres reservados (
<,>,&,',") se escapan como entidades (<,>,&,',")
XML válido está bien formado Y coincide con un esquema (DTD o XSD). Todos los analizadores XML pueden verificar el buen formado; la validación de esquema requiere herramientas adicionales.
Validación de Esquemas con DTD y XSD
DTD (Document Type Definition) — el formato de esquema más antiguo y sencillo:
<!DOCTYPE productos [
<!ELEMENT productos (producto+)>
<!ELEMENT producto (nombre, precio)>
<!ATTLIST producto id ID #REQUIRED>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT precio (#PCDATA)>
]>
XSD (XML Schema Definition) — el estándar moderno, escrito en XML:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="producto">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="precio" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
XSD soporta tipos de datos completos (enteros, fechas, decimales, patrones), es consciente de los espacios de nombres y es mucho más expresivo que DTD. Usa XSD para cualquier definición de nuevo formato XML.
XPath — Consultar XML
XPath es un lenguaje de consulta para seleccionar nodos dentro de un documento XML:
/productos/producto[@id='1001']/nombre/text() — seleccionar nombre del producto con id 1001
//precio[. > 50] — seleccionar todos los precios mayores que 50
/productos/producto[last()] — seleccionar el último producto
count(//producto) — contar todos los elementos producto
XPath por línea de comandos con xmlstarlet:
xmlstarlet sel -t -m "//producto" -v "nombre" -o " — " -v "precio" -n productos.xml
XSLT — Transformar XML
XSLT (Extensible Stylesheet Language Transformations) transforma XML en HTML, otros formatos XML o texto plano. Aquí hay un XSLT sencillo que convierte una lista de productos XML en una tabla HTML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr><th>Nombre</th><th>Precio</th></tr>
<xsl:for-each select="productos/producto">
<tr>
<td><xsl:value-of select="nombre"/></td>
<td><xsl:value-of select="precio"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Aplicar con: xsltproc transformar.xsl productos.xml > salida.html
Dónde Sigue Dominando XML en 2025
Formatos de Microsoft Office
El hecho más sorprendente sobre XML: cada archivo DOCX, XLSX y PPTX es un archivo ZIP que contiene ficheros XML. Renombra cualquier .docx a .zip y ábrelo — encontrarás:
word/document.xml— el contenido del documentoword/styles.xml— estilos de formatodocProps/core.xml— metadatos (autor, fecha)
En un XLSX: xl/worksheets/sheet1.xml (datos de celdas), xl/sharedStrings.xml (valores de texto), xl/styles.xml (formato).
SVG — Gráficos Vectoriales Escalables
SVG es un formato de imagen basado en XML. Cada archivo SVG es XML válido que puedes abrir en un editor de texto:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="blue"/>
<text x="50" y="55" text-anchor="middle" fill="white">SVG</text>
</svg>
Feeds RSS y Atom
La sindicación de blogs y la distribución de podcasts usan RSS (Really Simple Syndication) y Atom — ambos formatos XML. Cada aplicación de podcasts analiza XML para obtener información de los episodios.
Desarrollo Android
Los recursos de las apps Android son XML: diseños (res/layout/activity_main.xml), recursos de cadenas (res/values/strings.xml), manifiestos (AndroidManifest.xml).
Otros Dominios XML
- sitemap.xml: El estándar de Google para informar a los rastreadores de búsqueda sobre las páginas
- Servicios web SOAP: APIs bancarias empresariales, sanitarias (HL7 FHIR) y gubernamentales
- Maven: Construcción de proyectos Java (
pom.xml) - SCORM: Empaquetado de contenido de aprendizaje electrónico
- UBL (Universal Business Language): Estándares de factura electrónica y adquisición
- OpenDocument Format (ODF): Formatos de documentos de LibreOffice y OpenOffice
Comparativa XML vs JSON
| Característica | XML | JSON |
|---|---|---|
| Verbosidad | Alta | Baja |
| Comentarios | Sí | No |
| Atributos | Sí (elemento + atributo) | No (solo claves) |
| Espacios de nombres | Sí (xmlns) | No |
| Tipos de datos nativos | No (todo texto) | Sí (6 tipos) |
| Esquema/validación | DTD, XSD (maduros) | JSON Schema (más reciente) |
| Transformación | XSLT (potente) | jq (más sencillo) |
| Streaming | Analizador SAX | NDJSON |
| Herramientas | Excelentes (décadas) | Excelentes |
| Soporte en navegadores | XPath en JS | JSON.parse() integrado |
Convertir XML a JSON
import xmltodict, json
# pip install xmltodict
with open('datos.xml') as f:
contenido_xml = f.read()
datos = xmltodict.parse(contenido_xml)
with open('salida.json', 'w') as f:
json.dump(datos, f, indent=2, ensure_ascii=False)
Nota: Los atributos XML se convierten en claves @nombre-atributo en la salida JSON. La distinción atributo/elemento de XML no se mapea perfectamente a JSON — revisa la salida cuidadosamente para esquemas complejos.
Convertir XML a CSV (XML Tabular)
Para XML con una estructura repetitiva regular:
import xml.etree.ElementTree as ET, csv
arbol = ET.parse('datos.xml')
raiz = arbol.getroot()
with open('salida.csv', 'w', newline='') as f:
escritor = csv.writer(f)
escritor.writerow(['nombre', 'precio']) # encabezado
for item in raiz.findall('item'):
escritor.writerow([
item.find('nombre').text,
item.find('precio').text
])
Para XML complejo, la biblioteca lxml con consultas XPath da más control:
from lxml import etree
arbol = etree.parse('datos.xml')
filas = arbol.xpath('//producto')
Herramientas XML de Línea de Comandos
# Formatear y validar el buen formado
xmllint --format input.xml
# Validar contra un esquema XSD
xmllint --schema esquema.xsd input.xml
# Aplicar una transformación XSLT
xsltproc transformar.xsl input.xml > salida.html
# Consultas XPath con xmlstarlet
xmlstarlet sel -t -m "//item" -v "nombre" -n datos.xml
# Editar XML con xmlstarlet
xmlstarlet ed -u "//producto[@id='1']/precio" -v "99.99" productos.xml
Errores Comunes con XML
- Confusión de espacios de nombres: Olvidar declarar los espacios de nombres o mezclar prefijos es una fuente común de errores del analizador
- Codificación de caracteres: Declara siempre
encoding="UTF-8"en la declaración XML y guarda los archivos en UTF-8 - Referencias de entidad: Los
&,<y>literales en el contenido deben escaparse como&,<,> - Uso excesivo de CDATA: Las secciones CDATA se usan a menudo innecesariamente — no pueden anidarse y pueden complicar el análisis
- Gestión del espacio en blanco: Los analizadores XML preservan el espacio en blanco entre elementos por defecto — esto puede sorprender a los desarrolladores que vienen de JSON
- Rendimiento con archivos grandes: El análisis DOM carga el archivo completo en memoria. Para archivos XML grandes, usa analizadores SAX (basados en eventos) o StAX (streaming)
Conversiones relacionadas
Conversiones de documento que siguen este tema: