XML

¿Qué es un archivo XML?

El antepasado verboso de JSON. Sigue siendo la columna vertebral del intercambio de datos entre empresas y administraciones.

Qué es XML

XML es un formato de texto plano que se abre en cualquier editor. Se usa para mover datos entre programas.

La extensión es .xml y el nombre completo, Extensible Markup Language. Ambos importan menos que lo que el archivo puede contener, y de eso trata el resto de esta página.

De dónde viene XML

W3C lo publicó en 1998. La especificación es XML 1.0.

A un formato que lleva tanto tiempo siendo legible se le puede confiar algo que quieras recuperar dentro de diez años.

La especificación es pública

Está publicada entera, así que cualquiera puede implementarla leyendo el documento en vez de a base de inspeccionar archivos. Por eso aparece en tantos programas, y por eso los archivos escritos hace veinte años siguen abriéndose hoy. Publicada no quiere decir libre de regalías: cuando un formato envuelve un códec, la licencia de las patentes es un asunto aparte que la norma no resuelve.

No se tira nada

XML guarda su contenido exactamente. Volver a guardarlo no cambia nada, así que puedes abrirlo, editarlo y guardarlo tantas veces como quieras sin acumular daño; eso es lo que lo convierte en un formato de trabajo y no de entrega.

Puedes dejar notas dentro

XML tiene sintaxis de comentarios, que es la diferencia entre un archivo que mantiene una persona y uno que escribe un programa. Los comentarios son lo primero que se pierde al convertir a un formato que no los tiene, y nada te avisa.

Qué abre XML

Visual Studio Code y oXygen XML Editor lo leen, y también la mayoría de programas del mismo tipo.

Cuando un archivo no se abre, el formato rara vez es el problema: lo más habitual es que el programa sea anterior al formato. Convertir a algo más antiguo es la salida fiable, y para eso está el resto de este sitio.

Abrirlo en el navegador

Cualquier navegador actual lo lee.

Eso lo convierte en algo que puedes poner en una página o adjuntar a un mensaje sin preguntarte qué tiene instalado el otro lado.

Es un formato de trabajo

XML está pensado para abrirse y cambiarse. Guarda el archivo en este formato mientras el trabajo siga en marcha y exporta desde él cada vez que haga falta una copia terminada.

Una manera de anotar estructura, no un formato concreto

XML no describe nada por sí mismo. Es un conjunto de reglas para marcar un documento con elementos anidados y atributos, y el significado lo pone el vocabulario que se construya encima: RSS, SVG, SOAP, la factura electrónica, los mensajes sanitarios HL7, los mapas de sitio, los diseños de pantalla de Android y las tripas de cualquier archivo de Office o de OpenDocument.

Así que decir «un archivo XML» informa tan poco sobre el contenido como decir «un archivo de texto». Lo que importa es qué vocabulario sigue, y eso normalmente se declara en el elemento raíz o en el esquema al que el documento apunta.

Bien formado y válido son dos palabras distintas

Bien formado quiere decir que la sintaxis es correcta: un único elemento raíz, todas las etiquetas cerradas, anidamiento limpio, atributos entrecomillados y los caracteres & y < escapados allí donde se quieren como texto. Los otros tres reservados son más estrechos de lo que se suele enseñar: > solo hay que escaparlo dentro de ]]>, y las comillas solo donde cerrarían el atributo en el que están. Un analizador rechaza cualquier cosa por debajo de eso — XML es estricto a propósito y, a diferencia de HTML, no hay recuperación de errores.

Válido quiere decir además que se ajusta a un esquema: este elemento puede contener aquellos, este atributo es obligatorio, este valor tiene que ser una fecha. Un documento puede estar impecablemente bien formado y ser completamente inservible para su propósito, y lo que distingue una cosa de otra es un analizador validador. En los intercambios regulados esa validación es el contrato, y ahí está la mayor parte del motivo por el que XML sigue donde está.

Los espacios de nombres y los errores que provocan

Existen para que dos vocabularios se puedan combinar sin que choquen sus nombres de elemento: una tabla de XHTML y la tabla de un catálogo de muebles en el mismo documento. Un espacio de nombres se identifica con un URI, que es un nombre y no una dirección: de ahí no se descarga nada y no tiene por qué resolver a ninguna parte.

Son también la mayor fuente de errores al programar contra XML. Una consulta escrita sin tener en cuenta el espacio de nombres del elemento no encuentra nada, en silencio, mientras el documento se ve perfecto a ojo humano. Si un analizador insiste en que no existe un elemento que tú estás mirando en pantalla, el espacio de nombres es el primer sitio donde buscar.

La declaración de codificación no es adorno

La primera línea de un archivo XML decente declara la versión y la codificación de caracteres. A diferencia de un archivo de texto plano, eso convierte la codificación en parte del documento en vez de en una suposición, y es la razón de que XML maneje tildes, eñes y diacríticos de cualquier idioma con más fiabilidad de la que han tenido nunca el CSV o el INI.

Dos consecuencias que vale la pena conocer. Un archivo que declara una codificación y está guardado en otra está roto de una manera que produce errores de análisis desconcertantes en lugar de caracteres visiblemente mal. Y una marca de orden de bytes por delante de la declaración molesta a algunos analizadores, así que aquí, como en todo lo demás, la opción a preferir es «UTF-8 sin BOM».

Las entidades externas son un problema de seguridad de verdad

XML tiene un mecanismo para definir abreviaturas — las entidades — y clásicamente una entidad podía apuntar a un recurso externo. Un analizador que las resuelva leerá archivos locales o hará peticiones de red por cuenta de quien haya enviado el documento.

Eso es la vulnerabilidad XXE, y ha producido filtraciones reales exponiendo archivos del servidor a través de una subida de aspecto inocente. Un truco emparentado, el ataque de los mil millones de risas, anida definiciones de entidades para que un archivo minúsculo se expanda hasta agotar la memoria. Que las entidades externas se resuelvan o no por defecto depende de la biblioteca y no está zanjado — los analizadores incluidos en Java y lxml en Python las resuelven salvo que se les diga lo contrario —, así que es un ajuste que se comprueba y no se supone. Todo XML que llegue de fuera es entrada no confiable.

Las herramientas son la razón de que siga vivo

XPath direcciona cualquier parte de un documento con una expresión compacta y es genuinamente excelente: una sola línea saca todos los elementos de precio dentro de un producto cuyo atributo de categoría coincida. XSLT transforma un documento XML en otro, o en HTML, o en texto, de forma declarativa. XSD define y hace cumplir un esquema. Los tres son estándares, los tres están maduros, y los equivalentes del mundo JSON llegaron después y con un soporte menos uniforme.

Eso es lo que se quiere decir con que XML es verboso pero capaz. Los signos de mayor y menor son el precio; la maquinaria de consulta, transformación y validación es lo que se compra, y en los sectores que la necesitan sigue sin haber nada equivalente.

Qué se pierde al convertirlo aquí

Este sitio convierte XML a JSON, YAML, TOML, INI y NDJSON en el navegador, y ninguna de esas salidas se marca como sin pérdida cuando el origen es XML. El motivo está en lo que hace el analizador: los comentarios se descartan, las secciones CDATA se desenvuelven, el contenido mixto — texto con marcado dentro — se concatena y pierde su orden, y los valores de atributo se convierten en números cuando lo parecen, de modo que ver="1.0" llega al otro lado como 1.

Hay un caso peor y conviene señalarlo aparte: un elemento repetido que en ese documento concreto aparece una sola vez se colapsa en un objeto suelto en lugar de en una lista de un solo miembro, así que dos documentos con la misma estructura producen JSON de formas distintas. Los atributos y los nodos de texto acaban los dos como claves, que es un juicio que el conversor toma por ti. XML con forma de datos pasa razonablemente; XML con forma de documento no sobrevive a la ida y vuelta. Hacia una tabla no hay ruta directa: si lo que quieres es una hoja de cálculo, el camino es pasar primero por JSON y desde ahí a CSV, decidiendo tú qué parte del árbol son las filas.

Leerlo y editarlo sin sufrir

Cualquier editor de texto lo abre, y merece la pena usar uno con soporte de XML: pliega secciones, comprueba mientras escribes si sigue bien formado y reformatea un archivo que llegó como una única línea kilométrica, que es como llega casi todo el XML generado por una máquina. Los navegadores también lo pintan como un árbol desplegable, que es la forma más rápida de mirar uno desconocido.

Un aviso para el camino de vuelta: los comentarios no sobreviven a ninguna conversión, ni en XML ni en YAML, TOML o INI. Si el archivo lleva anotaciones que explican por qué un valor es el que es, cópialas a otro sitio antes de convertir, porque el orden de las claves sí se respeta pero de los comentarios no queda rastro.

Los datos, en un solo sitio

Identificadores y procedencia del formato XML.
Extensión.xml
Tipo de medioapplication/xml, text/xml
Publicado porW3C
Primera publicación1998
EspecificaciónXML 1.0