Herramienta de Formato XML
¿Qué es el Formateo XML?
El formateador XML convierte XML compacto o desordenado en una estructura indentada y legible. XML aparece en archivos de configuración, mensajes SOAP, sitemaps, feeds RSS, documentos de oficina, artefactos de compilación y muchas integraciones empresariales antiguas, donde una etiqueta de cierre ausente o un carácter mal escapado puede romper el procesamiento. La herramienta ayuda a ver elementos anidados, atributos, nodos de texto, espacios de nombres y posibles zonas de error más rápido que leyendo una línea comprimida. Es útil para depurar, documentar, comparar y enseñar, pero no sustituye la validación con XSD, contrato API o formato de un socio. Formatear mejora la lectura; no corrige automáticamente XML inválido.
Cómo usar
Cómo usar
- Pega o introduce datos XML en el cuadro de entrada izquierdo
- Selecciona el tamaño de sangría (2 espacios, 4 espacios o Tab)
- Haz clic en Formatear para embellecer o en Minimizar para eliminar espacios en blanco
- Los resultados se muestran a la derecha con resaltado de sintaxis
- Haz clic en Copiar o Descargar para guardar el resultado
Notas sobre XML
- El formateo cambia el espaciado en blanco, no el significado del documento, pero el espaciado aún puede ser importante dentro de nodos de texto y documentos de contenido mixto.
- Si el análisis falla, verifica etiquetas no cerradas, anidamiento incorrecto, atributos duplicados y caracteres sin escapar como el ampersand.
Casos de uso
` (una característica SGML aceptada por XML 1.0 §3.1) se conserva como tal, así que los elementos vacíos de HTML que viajan dentro de XHTML o RSS deben mantener su barra; usar `
` cambiará silenciosamente la página renderizada en parsers HTML5. Las secciones CDATA, incluida la regla literal del terminador `]]>`, también se mantienen intactas en lugar de des-escaparse a entidades `&`.
Principio técnico
El formateo XML se basa en la recomendación W3C XML 1.0 (Quinta Edición). El análisis se realiza mediante `new DOMParser().parseFromString(src, 'application/xml')` (o `text/xml`), que devuelve un Document cuyos nodos coinciden con las siete producciones definidas en la especificación: Element, Attr, Text, CDATASection, Comment, ProcessingInstruction y DocumentType. A diferencia de HTML, los parsers XML son estrictos: una etiqueta sin cerrar, un `&` sin escapar o un atributo duplicado aborta el análisis y el DOMParser devuelve un elemento `<parsererror>` cuyo cuerpo contiene la línea y la columna. Los equivalentes del lado del servidor incluyen libxml2 (`xmllint --format`), `xml.etree.ElementTree` de Python, StAX/SAX de Java y `XmlReader` de .NET. El impresor serializa el DOM nodo por nodo: cada Element se abre en su propia línea con depth*indent espacios, los hijos recurren con depth+1, la etiqueta de cierre se alinea con la de apertura y los elementos vacíos colapsan a la forma de autocierre `<foo/>` que el §3.1 de la especificación declara semánticamente equivalente a `<foo></foo>`. Cinco entidades predefinidas se recodifican siempre en valores de texto y atributos: `&` `<` `>` `"` `'`. Las secciones CDATA (`<![CDATA[ ... ]]>`) se preservan tal cual porque son la vía de escape explícita para contenido que de otro modo necesitaría codificación de entidades; el terminador `]]>` no puede aparecer dentro de un bloque CDATA según el §2.7, lo que el parser aplica. Las instrucciones de procesamiento como `<?xml-stylesheet?>` y la declaración XML `<?xml version="1.0" encoding="UTF-8"?>` se mantienen en el prólogo del documento. La declaración DOCTYPE se transmite como una única cadena. Dos sutilezas generan la mayor parte de la complejidad del formateador. Primero, el contenido mixto, un elemento que contiene tanto texto como elementos hijos, como `<p>Hola <b>mundo</b>!</p>`, no se puede re-indentar sin alterar el infoset del documento, porque cada carácter de espacio en blanco en dicho contexto es un nodo Text significativo. Los formateadores detectan el contenido mixto analizando si un Element tiene algún hijo Text que no sea espacio en blanco y cambian a una serialización en una sola línea para ese subárbol. Segundo, las declaraciones de namespace (`xmlns`, `xmlns:prefix`) deben permanecer en el elemento donde se declaran por primera vez; moverlas cambia el alcance. El orden de atributos no es canónico según la especificación, por lo que la mayoría de los formateadores aplican orden alfabético mientras preservan las declaraciones `xmlns:*` iniciales. El análisis y la serialización son O(n) sobre la longitud del documento; los feeds muy grandes suelen transmitirse vía SAX en lugar de construir un DOM en memoria.
- Especificación: W3C XML 1.0 Quinta Edición (REC-xml-20081126); el DOM se construye mediante `DOMParser().parseFromString(src, 'application/xml')`, equivalente a libxml2 o `xmllint --format` del lado del servidor.
- Estricto por diseño: etiquetas sin cerrar, `&`/`<` sin escapar, atributos duplicados o caracteres no válidos generan un elemento `<parsererror>`; la recuperación permisiva de HTML no se aplica.
- Cinco entidades predefinidas recodificadas en valores de texto y atributos: `&` `<` `>` `"` `'`. Las referencias de caracteres numéricas como ` ` se preservan tal cual.
- `<foo/>` de autocierre y `<foo></foo>` son semánticamente idénticos según el §3.1; las secciones CDATA se preservan tal cual y no pueden contener el terminador `]]>`.
- El contenido mixto (texto + elementos hijos) no se puede re-indentar sin cambiar el infoset: el impresor detecta espacios en blanco significativos y serializa esos subárboles en línea.
- Las declaraciones de namespace (`xmlns`, `xmlns:prefix`) permanecen en el elemento de primera declaración; moverlas cambia el alcance. El orden de atributos no es canónico, por lo que es típico un orden estable (xmlns primero, luego alfabético).
- Complejidad: O(n) para análisis y O(n) para serialización en herramientas basadas en DOM; documentos grandes se transmiten vía SAX/StAX (xml.sax en Python, javax.xml.stream en Java) para evitar cargar el árbol completo en memoria.
Ejemplos
Elementos básicos
<!-- Entrada (una línea) -->
<book><title>XML Guide</title><author>Jane Doe</author><year>2024</year></book>
<!-- Salida (2 espacios) -->
<book>
<title>XML Guide</title>
<author>Jane Doe</author>
<year>2024</year>
</book>Con atributos
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="b001" lang="en" available="true">
<title>Effective XML</title>
<price currency="USD">29.99</price>
</book>
</catalog>Estructura anidada con espacios de nombres y CDATA
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns:GetUser xmlns:ns="https://example.com/api">
<ns:UserId>10086</ns:UserId>
<ns:Script>
<![CDATA[ if (a < b && b > 0) { return true; } ]]>
</ns:Script>
</ns:GetUser>
</soap:Body>
</soap:Envelope>Preguntas frecuentes
¿Qué hace?
Formatea XML con indentación de elementos anidados, coloca cada elemento en su propia línea y alinea las etiquetas de cierre. Útil para inspeccionar respuestas SOAP, feeds RSS, archivos de configuración y otras cargas XML que llegan como una sola línea gigante.
¿Valida contra un esquema?
No. Formatea cualquier XML bien formado que pegues. La validación contra esquemas (XSD, DTD, RELAX NG) requiere una herramienta aparte. Los errores de buena formación (etiquetas desemparejadas, corchetes de cierre faltantes) se reportan, pero la página no los corrige.
¿Conserva el orden de los atributos?
Sí. Técnicamente, según la especificación, el orden de los atributos XML no es significativo, pero el formateador conserva el orden original para no sorprenderte. Las secciones CDATA, los comentarios y las instrucciones de procesamiento también se preservan.
¿Cómo se gestionan los espacios en blanco?
Los espacios entre elementos se normalizan (un elemento por línea con indentación). Los espacios dentro del contenido textual se conservan por defecto: el contenido del elemento es significativo. Los atributos xml:space='preserve' se respetan donde aparezcan.
¿Puedo minificar XML?
Algunas versiones ofrecen un modo de minificación que elimina los espacios entre elementos. Cuidado: cualquier espacio que fuera significativo (contenido textual, regiones xml:space='preserve') debe preservarse. Prueba el ciclo completo si tu XML tiene contenido de texto enriquecido.
¿Se sube el XML?
No. El parseo y el formateo se ejecutan en tu navegador usando DOMParser y XMLSerializer (integrados en el navegador). No se transmite nada.
¿Y los espacios de nombres XML?
Las declaraciones de espacios de nombres (xmlns) y los elementos o atributos con prefijo se formatean exactamente como están escritos. Si redeclaras el mismo namespace en elementos anidados, se conserva (algunos validadores lo tienen en cuenta, otros no).