Formatear XML
El formateador de XML reindenta un documento XML en tu navegador con un tokenizador de una sola pasada, así que los comentarios, las secciones CDATA, los subconjuntos DOCTYPE y los valores de atributo que contienen corchetes angulares sobreviven intactos. Informa de las etiquetas mal emparejadas o sin cerrar con línea y columna en lugar de remodelar el árbol en silencio.
¿Cómo funciona Formatear XML?
La mayoría de los formateadores de XML son una serie de expresiones regulares: quitar los comentarios, luego partir por las etiquetas, luego reindentar. Ese orden no se puede hacer correcto, porque las pasadas se dependen entre sí en círculo. Decidir si <!-- abre un comentario exige saber si estás dentro de una sección CDATA. Decidir dónde empieza una sección CDATA exige saber que no estás dentro de un comentario. Decidir si > cierra una etiqueta exige saber si estás dentro de un valor de atributo. Elijas el orden que elijas, uno de los tres está mal, y el fallo es corrupción silenciosa en lugar de un error.
Así que este formateador escanea el documento exactamente una vez hacia un flujo de tokens —declaración, instrucción de procesamiento, DOCTYPE, comentario, CDATA, etiqueta de apertura, etiqueta de cierre, etiqueta de autocierre, texto— y todo lo que viene después es un plegado sobre esos tokens. El tokenizador no pierde nada por construcción: cada byte de la entrada cae en exactamente un token, y hay una prueba que afirma que concatenarlos reproduce el documento original byte a byte.
Ese diseño es lo que hace que los casos incómodos funcionen en lugar de tratarse a mano. Un DOCTYPE con subconjunto interno puede contener > dentro, así que el escaneo lleva la cuenta de la profundidad de corchetes en lugar de tomar el primer cierre de ángulo. Un valor de atributo puede contener >, así que el escaneo de etiquetas sigue las comillas. Un < desnudo que no es el inicio de una etiqueta —XML inválido, omnipresente en archivos escritos a mano— se deja pasar como texto en lugar de abortar un formato que quien escribe ve que debería salir bien.
La indentación conserva una excepción deliberada: un elemento cuyo único hijo es texto se queda en una línea, así que obtienes <name>Ada</name> en lugar de tres líneas para dos palabras. Explotar cada hoja es la razón principal por la que el XML formateado por una máquina es más difícil de leer que el escrito a mano.
Cuando el árbol no se cierra bien, el formateador se detiene y dice dónde. Un </c> mal emparejado donde se esperaba </b> se informa con su línea y columna; un documento que termina a mitad de árbol nombra los elementos todavía abiertos. La alternativa —cerrarte las etiquetas en silencio— produce un documento que parece correcto y no es el que tenías, que es el peor desenlace disponible.
Entrada minificada
<r><a id="1"><b>x</b></a><!-- c --><d/></r>
Salida formateada
<r>
<a id="1">
<b>x</b>
</a>
<!-- c -->
<d />
</r>¿Qué opciones y casos límite admite Formatear XML?
| Parámetro | Tipo | Valor predeterminado | Comportamiento y casos límite |
|---|---|---|---|
| Sangría | 2 | 4 | tab | 2 espacios | Se aplica por nivel de anidación. Las tabulaciones son la elección correcta si el archivo se va a leer en editores con preferencias distintas, porque cada lector controla el ancho visual. |
| Colapsar espacios en blanco | booleano | true | Normaliza las rachas de espacios y saltos de línea dentro de los nodos de texto. Desactívalo en documentos cuyo contenido de texto depende de los espacios, como código fuente incrustado fuera de una sección CDATA. |
| Quitar comentarios | booleano | false | Elimina por completo <!-- … -->. Los comentarios se conservan por defecto porque, en archivos de configuración, a menudo son la única documentación que hay. |
| Ajustar atributos | entero | 0 (nunca) | A partir de ese número, cada atributo va en su propia línea. Útil para SVG y XSLT, donde un solo elemento puede llevar una docena de atributos y una línea sin ajustar se sale de la pantalla. |
| CDATA | conservado | — | Se reproduce literal, con sus espacios internos y cualquier carácter que parezca marcado. La gracia de una sección CDATA es precisamente que su contenido no se analiza. |
| DOCTYPE | conservado | — | Se deja intacto, incluido un subconjunto interno que contenga caracteres >. Buscar hasta el primer > trunca la declaración y convierte el resto en texto. |
| Espacios de nombres | conservado | — | Los prefijos y las declaraciones xmlns pasan sin cambios. Esto es un formateador, no un validador: no comprueba que un prefijo esté declarado. |
| Entrada malformada | error | — | Una etiqueta de cierre que no coincide, un comentario o CDATA sin terminar, o un documento que se corta a mitad de árbol se notifican con su posición. Nada se autocorrige, porque un documento reparado en silencio ya no es el que tenías. |
Preguntas frecuentes
¿Formatear cambiará lo que significa mi XML?
Puede, de una forma concreta: los espacios en blanco dentro del contenido de texto son datos en XML, y colapsarlos cambia esos datos. Por eso Collapse whitespace es un interruptor y no está siempre activo —desactívalo en documentos donde el texto sea sensible a los espacios—. Todo lo demás se conserva exacto, incluidos los contenidos de CDATA, los comentarios, los valores de atributo y el DOCTYPE.
¿Por qué rechaza mi documento en lugar de arreglarlo?
Porque adivinar qué etiqueta querías cerrar no es algo que un formateador pueda hacer con seguridad. Ante <a><b></a>, cerrarte <b> produce un documento que parece correcto y tiene un árbol distinto del que escribiste. El error nombra la etiqueta y la posición para que decidas tú, lo que lleva segundos y no puede salir mal.
¿Maneja SVG, XSLT, RSS, SOAP y los layouts de Android?
Sí —todos son XML, y aquí nada conoce esquemas—. SVG y XSLT en particular se benefician de la opción de ajuste de atributos, porque un solo elemento con una docena de atributos es habitual y sin ajustar se sale de la pantalla con creces.
¿Y el HTML?
Solo HTML con forma de XHTML. El HTML real tiene elementos vacíos que nunca se cierran (<br>, <img>), etiquetas de cierre opcionales (<li>, <td>) y elementos de texto plano como <script> cuyo contenido no es marcado. Este tokenizador obliga a un documento a las reglas de XML, así que informará de un <br> sin cerrar como un error. Es correcto para XML y incorrecto para HTML.
¿Hay un límite de tamaño?
8 MB. El formato se ejecuta en el hilo principal, así que por encima de ese techo la herramienta se niega en lugar de bloquear la pestaña. Tanto tokenizar como formatear son iterativos y no recursivos, así que un documento profundamente anidado —hay una prueba con cinco mil niveles— informa un resultado en lugar de desbordar la pila de llamadas.
¿Se sube mi documento?
No. JavaScript lo tokeniza y lo reindenta en la pestaña que ya tienes abierta. Abre el panel Network y pega uno: nada que lo lleve sale de aquí. Los archivos de configuración XML contienen habitualmente cadenas de conexión, nombres de host internos y credenciales, que es justo el material que no debería pasar por un servidor desconocido para darle formato.