XPath, JSON y YAML
Qué hay alrededor de XML: transformar documentos con XSLT, seleccionar nodos con XPath y procesarlo desde un programa con DOM, SAX o JAXB. Y los formatos que lo han desplazado en la web: JSON, JWT y YAML.
Transformaciones: XSL, XSLT y XSL-FO
XSL es la familia de tecnologías pensada para transformar documentos XML. La idea de fondo es que un mismo documento de datos puede convertirse en muchas presentaciones distintas sin tocar los datos: basta con cambiar la hoja de transformación.
La pieza que se usa en la práctica es XSLT, de XSL Transformations. Es un lenguaje, escrito él mismo en XML, que describe reglas de transformación. Un procesador, como Apache Xalan, toma dos entradas (el documento XML de datos y la hoja XSLT) y las funde en una salida, que es otro documento de marcas: otro XML, un HTML o texto plano.
La otra pieza es XSL-FO, de Formatting Objects. Se diferencia en la salida: en vez de otro documento de marcas produce un entregable listo para imprimir o distribuir, típicamente un PDF o una imagen. El procesador de referencia es Apache FOP. Es la vía clásica para generar certificados o informes en PDF a partir de datos en XML.
| Tecnología | Entradas | Salida | Procesador típico |
|---|---|---|---|
| XSLT | XML de datos + hoja XSLT | Otro documento de marcas: XML, HTML, texto | Apache Xalan |
| XSL-FO | XML de datos + hoja XSL-FO | Un entregable: PDF, imagen | Apache FOP |
XSLT produce marcado; XSL-FO produce un documento final maquetado. Si la pregunta habla de generar un PDF a partir de XML, la respuesta es XSL-FO.
Para el examen
XSLT: produce marcado
XSL-FO: produce un documento final maquetado
Regla de examen: si hablan de generar un PDF a partir de XML, la respuesta es XSL-FO
XPath: seleccionar nodos dentro de un documento
XPath, de XML Path Language, es el lenguaje con el que se señala una parte concreta de un documento XML. No transforma ni valida: solo selecciona. Es la pieza sobre la que se apoyan XSLT para decidir a qué nodos aplica cada regla, los validadores y casi todas las API de proceso.
La forma más rápida de entenderlo es compararlo con los selectores de CSS, porque hacen lo mismo sobre árboles distintos. La sintaxis recuerda a una ruta de directorios: la barra baja un nivel y la doble barra busca a cualquier profundidad; los corchetes filtran; y la arroba indica que lo que sigue es un atributo, no un elemento.
| Lo que se busca | Selector CSS | Expresión XPath |
|---|---|---|
| Todos los elementos | * | //* |
| Todos los elementos <tema> | tema | //tema |
| Todos los hijos de <tema> | tema > * | //tema/* |
| El elemento con un id dado | #t7 | //*[@id='t7'] |
| Los que tienen cierto atributo | *[nivel] | //*[@nivel] |
| El primer hijo de <tema> | tema > *:first-child | //tema/*[1] |
| Los <tema> que contienen un <subtema> | No se puede en CSS | //tema[subtema] |
| El elemento siguiente | tema + * | //tema/following-sibling::*[1] |
| El elemento anterior | No se puede en CSS | //tema/preceding-sibling::*[1] |
En XPath las posiciones empiezan en 1, no en 0: el primer hijo es [1]. Es un error muy repetido en los apuntes, porque la costumbre de programar lleva a escribir [0].
La tabla enseña además dónde gana XPath: puede seleccionar un elemento por lo que contiene (todos los temas que tengan al menos un subtema) y puede recorrer hacia atrás, dos cosas que los selectores de CSS clásicos no permiten.
Para el examen
Dónde empiezan las posiciones: en 1, no en 0
El primer hijo: [1]
Procesar XML desde un programa: DOM frente a SAX
Para trabajar con un XML desde un programa hace falta un analizador, o parser. Hay dos enfoques radicalmente distintos, y la elección entre ellos es la pregunta clásica de este apartado porque no es de gusto: depende del tamaño del documento y de lo que se quiera hacer con él.
DOM es un estándar del W3C. El analizador lee el documento entero y construye en memoria un árbol de objetos que representa el documento completo. A partir de ahí el programa puede moverse libremente por el árbol, subir, bajar, añadir nodos, borrarlos o modificarlos, y volcar el resultado a un XML nuevo.
SAX funciona al revés. No construye nada: va leyendo el documento de principio a fin y, según encuentra cosas, avisa a una clase que el programador ha escrito previamente. Es lo que se llama un modelo de eventos: inicio de documento, inicio de etiqueta, texto, fin de etiqueta. El programa reacciona a esos avisos y decide qué guarda.
| DOM | SAX | |
|---|---|---|
| Modelo | Árbol de objetos en memoria | Eventos según se lee |
| Memoria | Ocupa mucha: carga el documento entero | Mínima: no guarda el documento |
| Recorrido | Libre en cualquier dirección | Solo hacia delante (forward-only) |
| Modificación | Sí: añadir, borrar y cambiar nodos | No: es solo lectura |
| Velocidad | Menor, por el coste de construir el árbol | El más rápido de los métodos |
| Cuándo conviene | Documentos pequeños que hay que recorrer y editar | Documentos enormes de los que solo se extraen datos |
Si el documento es grande y solo hay que leerlo, SAX. Si hay que recorrerlo en varias direcciones o modificarlo, DOM. La memoria es lo que decide.
Para el examen
SAX: por eventos y con poca memoria: documento grande y de solo lectura
DOM: árbol en memoria: recorrerlo en varias direcciones o modificarlo
JAXB, StAX y el marshalling
DOM y SAX tienen un inconveniente común: obligan a trabajar con nodos genéricos, no con los objetos del negocio. JAXB da un paso más y genera directamente objetos de las clases del dominio de la aplicación, de modo que en lugar de un nodo llamado Element se obtiene un objeto Alumno o un objeto Tema, con sus atributos y sus métodos.
Esas clases no hace falta escribirlas a mano: la utilidad xjc, que viene con el kit de desarrollo de Java, las genera automáticamente a partir de un esquema XSD. El esquema deja de ser solo un validador y pasa a ser también el contrato del que sale el código.
Los dos procesos que hay que saber nombrar son marshalling y unmarshalling, y se confunden constantemente porque la intuición los coloca al revés.
| Proceso | Dirección | Equivalente |
|---|---|---|
| Unmarshall | Del XML a los objetos en memoria | Deserializar |
| Marshall | De los objetos en memoria al XML | Serializar |
StAX es la variante de tirar en lugar de empujar. En vez de levantar el árbol de objetos entero, deja que sea el programador quien vaya pidiendo el siguiente trozo cuando lo necesita. Sirve para procesar en flujo, o streaming, y para construir un árbol solo con la parte del documento que interesa. Es el punto medio entre la comodidad de DOM y la frugalidad de SAX.
Marshall es del objeto al documento, como serializar. Unmarshall es del documento al objeto, como deserializar. El prefijo un- va del XML hacia dentro.
Para el examen
Marshall: del objeto al documento: serializar
Unmarshall: del documento al objeto
Regla mnemotécnica: el prefijo un- va del XML hacia dentro
StAX: analiza tirando del documento, no por eventos
Tipos de nodo y analizadores concretos
En el árbol que construye DOM todos los nodos comparten un mismo tipo general, Node, del que cuelgan varias especializaciones que conviene distinguir porque se preguntan por separado.
| Tipo de nodo | Qué representa |
|---|---|
| Element | Una etiqueta del documento |
| Attr | Un atributo de una etiqueta |
| Text | El texto que hay dentro de una etiqueta |
| Document | El documento entero |
Document es un tipo instrumental: representa al documento completo y es el punto de entrada para crear nodos nuevos, pero no es un nodo real del árbol, sino su contenedor. Su propiedad documentElement apunta al elemento raíz de verdad, que en HTML es la etiqueta <html>.
- Apache Xerces es la implementación de referencia tanto del analizador DOM como del SAX.
- En Java, DocumentBuilder es el analizador DOM y SAXParser el de SAX.
- El API Trax se encarga del camino de vuelta: vuelca a XML el árbol DOM que hay en memoria, transformando un origen en un resultado.
- Para seleccionar nodos concretos dentro del árbol se usa XPath, que es al XML lo que los selectores son al CSS.
Para el examen
En DOM: todos los nodos son Node, con especializaciones
Document: no es un nodo del árbol, sino su contenedor
documentElement: apunta a la raíz real
JSON, el formato de intercambio de la web actual
JSON, de JavaScript Object Notation, nació como la notación con la que se escriben los objetos en JavaScript y acabó convertido en estándar propio, la norma ECMA-404, con tipo MIME application/json. Ha desplazado a XML en el intercambio de datos entre navegador y servidor porque ocupa mucho menos, no lleva etiquetas de cierre y el navegador lo entiende de forma nativa.
Es un lenguaje sin esquema: por defecto no se valida contra ninguna gramática, y esa ligereza es parte de su atractivo. Cuando hace falta validar, existe la iniciativa JSON Schema, que persigue para JSON lo que XSD hace para XML.
| Tipo de dato | Cómo se escribe |
|---|---|
| Object | Entre llaves: un conjunto de pares atributo y valor; puede anidarse |
| Array | Entre corchetes, con los elementos separados por comas |
| String | Entre comillas dobles |
| Number | Sin comillas, con el punto como separador decimal |
| true y false | Sin comillas |
| null | Sin comillas |
- El nombre del atributo va SIEMPRE entre comillas, sin excepción.
- El valor va entre comillas solo si es una cadena.
- No hay tipo fecha: las fechas se escriben como cadenas, y por tanto entre comillas.
- El separador decimal es el punto; el separador de elementos, la coma.
- NaN significa Not a Number y es un valor de JavaScript, no de JSON.
- JSON no admite comentarios, a diferencia de XML y de YAML.
{
"alumno": "A-4312",
"curso": "largo",
"ultimoIntento": {
"tema": "aplicaciones-web-html-xml-y-scripting",
"fecha": "2026-08-16T18:20:00Z",
"aciertos": 18,
"nota": 8.5,
"superado": true,
"observaciones": null
},
"preguntasFalladas": ["q3", "q7", "q9"]
}Para procesarlo desde Java las librerías clásicas son Jackson y GSON, esta última de Google. En el estándar de la plataforma hay dos API: JSON-B, de alto nivel, que enlaza el JSON con las clases del dominio como hace JAXB con XML, y JSON-P, de bajo nivel, que trabaja con la estructura del documento.
El error más repetido en los ejercicios de JSON es dejar sin comillas el nombre de un atributo o ponerle comillas a un número. El nombre siempre va entrecomillado; el valor, solo si es cadena.
Para el examen
Nombre del atributo: siempre entre comillas
El valor: solo entre comillas si es una cadena
JWT, YAML y los lenguajes de marca ligeros
El uso de JSON que más se pregunta fuera del intercambio de datos es la autenticación web, mediante el JSON Web Token o JWT. Es una credencial que el servidor emite tras validar al usuario y que el cliente devuelve en cada petición dentro de la cabecera Authorization, precedida de la palabra Bearer.
El token son tres trozos separados por puntos, cada uno codificado en base64url. El primero es la cabecera, un objeto JSON que dice qué algoritmo lo firma y qué tipo de token es. El segundo es la carga útil, otro objeto JSON con las afirmaciones sobre el usuario: quién es, cuándo se emitió, cuándo caduca. Y el tercero es la firma, que se calcula sobre los dos anteriores con una clave que solo conoce el servidor.
// Estructura de un JWT: cabecera.carga.firma
// Cabecera: { "alg": "HS256", "typ": "JWT" }
// Carga: { "sub": "A-4312", "curso": "largo", "exp": 1789000000 }
// Firma: HMACSHA256( base64url(cabecera) + "." + base64url(carga), secreto )
fetch("/api/intentos", {
headers: { "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
});La cabecera y la carga de un JWT van codificadas en base64url, no cifradas: cualquiera puede leerlas. Lo que la firma garantiza es que nadie las ha alterado, no que sean secretas. Nunca se mete un dato sensible en la carga.
Los lenguajes de marca ligeros son formatos de sintaxis más simple que XML, pensados para escribir documentación con muy pocos caracteres y obtener aun así un documento presentable en la web. Los dos que hay que citar son Markdown, con extensión .md, y reStructuredText, con extensión .rst.
YAML, por su parte, es un formato de serialización legible por personas. Su nombre es un acrónimo recursivo: YAML Ain't Markup Language, es decir, YAML no es un lenguaje de marcado, declaración con la que sus autores quisieron subrayar que su objetivo son los datos y no el documento. La estructura la marca la sangría, no las llaves ni las etiquetas.
# YAML admite comentarios, y JSON no
tema: aplicaciones-web-html-xml-y-scripting
bloque: 3
nivel: 1
subtemas:
- slug: xml-bien-formado-y-valido
preguntas: 9
- slug: javascript-dom-y-eventos
preguntas: 9- Definir un API REST en formato Swagger u OpenAPI.
- Escribir un playbook de Ansible.
- Describir el entorno de trabajo de un desarrollador con Docker Compose.
Para el examen
Cabecera y carga del JWT: en base64url, NO cifradas
Qué garantiza la firma: que nadie las ha alterado, no que sean secretas