Formateador XML
Se formatea en tu navegador y nunca se transmite. El contenido mixto se deja en linea en vez de reindentarse, porque anadir saltos de linea alrededor del texto cambia lo que dice el documento. Se conservan el orden y las comillas de los atributos, y no se inventa ninguna declaracion XML.
Nada de lo que escribes aquí se almacena, registra ni comparte.
Pega XML para sangrarlo de forma legible o reducirlo a una linea, y para comprobar que esta bien formado. Los errores senalan la linea y la columna exactas. Todo se ejecuta en tu navegador, asi que no se sube nada.
Cómo usarlo
- Pega tu XML en el campo de entrada.
- Elige Formatear o Minificar y ajusta la sangria si quieres.
- Copia el resultado, o lee el error con su linea y columna.
Bien formado no es lo mismo que válido
XML tiene dos nociones distintas de corrección y se confunden constantemente. Bien formado significa que el documento respeta la sintaxis: un único elemento raíz, cada etiqueta cerrada por su etiqueta correspondiente, atributos entre comillas, comentarios y CDATA terminados y ningún texto suelto fuera de la raíz. Se puede comprobar solo con el documento, y es lo que informa esta herramienta.
Válido significa que, además, el documento se ajusta a un esquema - una DTD, un XSD o una gramática RelaxNG - que indica qué elementos pueden aparecer, en qué orden, cuántas veces y qué forma pueden tener sus atributos. Esa comprobación es imposible sin el esquema, y un documento puede estar perfectamente bien formado y no tener ningún sentido frente a la gramática que dice seguir.
Los espacios de nombres quedan un poco al margen de ambas cosas. Un prefijo usado sin su declaración xmlns es un error de espacio de nombres, no de buena formación, así que un documento puede pasar la comprobación de sintaxis y aun así ser rechazado por un parser que entiende espacios de nombres. Si un documento SOAP u Office se rechaza aunque se formatee sin problemas, conviene revisar pronto si hay un prefijo sin declarar.
A veces el espacio en blanco es contenido
Esta es la regla que guía todo lo que hace el formateador. El espacio entre elementos casi siempre es maquetación, y sustituirlo por otra maquetación no cambia nada. El espacio dentro de contenido mixto - texto y elementos como hermanos, como un párrafo con una palabra en negrita - forma parte del texto, y redistribuirlo cambia el documento.
Por eso los elementos con contenido mixto se dejan exactamente como están escritos, aunque quede una línea larga en medio de un documento indentado. La alternativa es lo que hacen la mayoría de formateadores: indentarlo todo, insertar un salto de línea entre Hello y <b>there</b> y producir un documento que se muestra con un hueco que antes no estaba. Queda más ordenado y es incorrecto.
La especificación ofrece xml:space="preserve" para declararlo explícitamente, y conviene usarlo en cualquier elemento cuyo texto sea significativo. Ten en cuenta que lo heredan los descendientes hasta que se sobrescribe, algo que sorprende a quien lo pone una sola vez en la raíz.
Lo que de verdad rompe un documento XML
El ampersand sin escapar es, con mucha diferencia, lo más habitual. En XML, & inicia una referencia a entidad, así que un & suelto en la query string de una URL o en el nombre de una empresa deja el documento mal formado. Hay que escribirlo &, y un signo menor que en el texto debe ser <. Solo existen cinco entidades predefinidas - amp, lt, gt, quot y apos - y cualquier otra debe declararse o escribirse como referencia numérica de carácter.
Después vienen los desajustes de codificación. La declaración al principio del archivo indica en qué codificación están los bytes, y si luego el archivo se guardó en otra, el parser leerá los caracteres multibyte como basura o fallará directamente. Un BOM delante de la declaración provoca sus propios fallos en algunos parsers. Relacionado con esto: unos cuantos caracteres de control no están permitidos en XML 1.0 de ninguna forma, ni siquiera escapados, así que los datos binarios que se han colado en un campo de texto no se arreglan codificándolos: hay que eliminarlos o convertirlos a Base64.
Y luego están las costumbres de HTML. Valores de atributo sin comillas, etiquetas sin cerrar como <br> y atributos duplicados son aceptables en HTML y fatales en XML. Si el documento procede de HTML, son lo primero que hay que buscar.
Entidades, y una advertencia sobre XML no confiable
XML permite que un documento declare sus propias entidades en una DTD, incluidas entidades externas que apuntan a una ruta de archivo o a una URL. Es la base de dos tipos de ataque muy conocidos, y vale la pena conocerlos aunque solo consumas XML y nunca lo escribas.
La inyección de entidades externas (XXE) usa una entidad que apunta a un archivo local para que el servidor lo lea y devuelva su contenido en la respuesta; históricamente ha sido una forma fiable de extraer configuración y credenciales de cualquier sistema que procesara XML subido con la configuración por defecto. El ataque billion laughs anida entidades para que cada una se expanda en varias de la siguiente, de modo que unos pocos kilobytes de entrada se convierten en gigabytes en memoria.
En ambos casos la defensa es desactivar el procesamiento de DTD y la resolución de entidades externas en el parser. La mayoría de las bibliotecas modernas ya son seguras por defecto, pero mucho código antiguo no. Esta página no resuelve nada externo: lee el documento como texto y nunca descarga nada a lo que haga referencia.
Espacios de nombres: el prefijo no es el nombre
Un espacio de nombres vincula un prefijo a un URI, y es el URI el que identifica al elemento; el prefijo es solo una abreviatura local que se puede renombrar libremente. Dos documentos que usan soap: y s: para el mismo URI son equivalentes, y dos documentos que usan ns1: para URIs distintos no lo son. El código que compara por el prefijo en lugar del URI funciona hasta que alguien reformatea el documento.
Un espacio de nombres predeterminado declarado con xmlns se aplica a los elementos pero no a los atributos, y esa es la regla que casi todo el mundo entiende mal. Un atributo sin prefijo no pertenece a ningún espacio de nombres, sin importar lo que declare el elemento que lo contiene; por eso xsi:type y xml:lang siempre se escriben con prefijo.
Cuando un analizador rechaza un documento que parece bien formado, la causa habitual es un prefijo sin declarar. El formateo sí va a funcionar, porque la vinculación del prefijo es una regla de espacios de nombres y no de sintaxis, y el fallo aparece más tarde, en aquello que consume el documento.
Qué te da realmente validar contra un esquema
Estar bien formado es cuestión de sintaxis; ser válido es ajustarse a una gramática. DTD es el mecanismo original, limitado y todavía en uso para declarar entidades. XSD es el dominante: escrito en el propio XML, expresivo en cuanto a tipos de datos y tan verboso que leer uno es una destreza en sí misma. RelaxNG resulta mucho más agradable de escribir y tiene menos soporte, que es el intercambio de siempre.
Lo que compra un esquema es un contrato que puede comprobarse mecánicamente en la frontera, antes de que tu código vea los datos: que estén los elementos obligatorios, que haya números donde van números, que los valores enumerados caigan dentro de su conjunto. En las integraciones con socios, el esquema suele ser la única especificación en la que ambas partes coinciden.
Validar dentro de una canalización es cosa de un solo comando - xmllint --schema schema.xsd file.xml --noout - y los mensajes de error señalan una línea y un elemento. La razón de hacerlo en el borde y no en el código de la aplicación es que un fallo de esquema es un rechazo limpio y con motivo, mientras que el mismo problema detectado tres capas más adentro es un stack trace.
Sacar datos con XPath
XPath es el lenguaje de consulta de XML y bien vale una hora del tiempo de cualquiera. //book/title selecciona todos los elementos title que cuelgan de un book en cualquier parte del documento; //book[@id='b1'] selecciona por atributo; //book[price>30]/title filtra por el valor de un hijo. Es el lenguaje de direccionamiento que hay debajo de XSLT, de las herramientas XML de Java, de lxml en Python y de casi toda la automatización de navegadores.
Los espacios de nombres son donde XPath se vuelve incómodo. La expresión tiene que vincular los prefijos que usa, y en un documento con espacio de nombres predeterminado los elementos están en ese espacio aunque aparezcan sin prefijo; por eso //book no encuentra nada y el primer XPath que todo el mundo escribe contra una respuesta SOAP vuelve vacío. Las herramientas difieren en cómo permiten registrar esa vinculación, y la función local-name() es la salida de emergencia tosca.
XSLT es el lenguaje de transformación construido encima, y sigue siendo la forma más práctica de convertir un vocabulario XML en otro - o en HTML - sin escribir código procedimental. Su fama de difícil tiene más que ver con el estilo funcional que con la sintaxis.
XML sigue estando en todas partes
Los documentos de oficina son XML: un .docx o un .xlsx es un archivo zip que contiene un directorio de partes XML, y por eso a veces un documento dañado se puede reparar descomprimiéndolo y arreglando un solo archivo. SVG es XML, así que un icono se puede editar con un editor de texto y generar desde una plantilla. Los feeds RSS y Atom son XML, y también lo es el sitemap que publica este sitio.
En la integración empresarial y gubernamental, SOAP está lejos de estar muerto: la banca, los seguros, la salud a través de HL7 y los sistemas aduaneros y tributarios de la mayoría de los países funcionan sobre XML con esquemas y, con frecuencia, con cargas firmadas. XML Signature y XML Encryption permiten firmar un único elemento dentro de un documento mayor, algo para lo que JSON no tiene equivalente estándar.
Los diseños de Android, las compilaciones de Maven, la configuración de .NET e incontables descripciones de CI también son XML. El formato está pasado de moda, no obsoleto, y saber leerlo con soltura es una habilidad que dura.
Analizar XML que no escribiste tú
Los valores predeterminados de muchas bibliotecas XML no son seguros frente a entradas no confiables, y la razón es el mecanismo de entidades. Las entidades externas permiten que un documento haga referencia a un archivo local o a un URL, de modo que a un servidor que analiza XML subido por usuarios con la configuración por defecto se le puede hacer leer /etc/passwd y devolverlo: el ataque XXE, que todavía aparece en sistemas en producción años después de haber sido catalogado.
La expansión es la otra cara. El ataque billion laughs anida entidades de forma que unos pocos kilobytes de entrada se expanden a gigabytes en memoria y tumban el proceso. Ninguno de los dos ataques necesita nada extraño: ambos son XML corriente que usa funciones definidas por la propia especificación.
La defensa es una línea en la mayoría de las bibliotecas - desactivar el procesamiento de DTD y la resolución de entidades externas - y conviene comprobarlo en lugar de darlo por hecho, porque los valores por defecto cambian según el lenguaje y la versión. Esta página no resuelve absolutamente nada externo: lee el documento como texto y nunca descarga aquello a lo que hace referencia.
Preguntas frecuentes
- Por que parte de mi XML se queda en una sola linea?
- Porque contiene contenido mixto: texto junto a elementos, como en "Hello <b>there</b>." Sangrar eso insertaria saltos de linea y espacios dentro del propio texto, y un renderizador mostraria "Hello there ." con un hueco de mas. Por eso esos elementos se dejan exactamente como se escribieron. La mayoria de formateadores de XML los reflujan igualmente y cambian el documento en silencio.
- Formatear puede cambiar lo que dice mi documento?
- No, y ese es el motivo de la regla anterior. El espacio entre elementos es maquetacion y se sustituye; el espacio dentro del contenido mixto es dato y se conserva. El orden y el estilo de comillas de los atributos se mantienen tal cual, los comentarios y CDATA se copian intactos, y no se anade ninguna declaracion XML si el documento no la tenia.
- Que comprueba realmente "bien formado"?
- Que todo elemento se cierra con una etiqueta que le corresponde, que los valores de atributo llevan comillas, que los comentarios y bloques CDATA estan terminados, y que hay exactamente un elemento raiz sin texto suelto fuera de el. No valida contra una DTD ni un esquema: eso requeriria el esquema, que es otra herramienta.
- Por que se ha rechazado mi atributo?
- XML exige comillas alrededor de cada valor de atributo. HTML te deja escribir disabled=true o width=100 y los navegadores lo aceptan, pero XML no, y todos los analizadores posteriores lo rechazaran. Si el documento viene de una fuente HTML, suele ser lo primero que hay que arreglar.
- Cual es la diferencia entre minificar y formatear?
- Son operaciones opuestas sobre el mismo documento. Formatear inserta saltos de linea y sangria entre elementos para que se pueda leer; minificar lo quita todo para que el documento sea lo mas pequeno posible al transportarlo. Ninguna de las dos toca el contenido mixto, asi que aplicar una despues de la otra te devuelve al punto de partida.
- Se sube mi XML a alguna parte?
- No. El analisis y el formateo ocurren en tu navegador, asi que los archivos de configuracion, las cargas SOAP y los volcados de exportacion - que a menudo contienen nombres de host internos, identificadores y datos personales - nunca salen de tu equipo.
Última actualización:
Incluye los pasos, el resultado esperado y el real. Elimina secretos y datos personales.
