Formateador XML

Embellece XML con 2 espacios, 4 espacios o tabulaciones, o minificalo en una sola linea. Se comprueba que este bien formado mientras escribes y se muestran elementos y profundidad.

Haz legible un muro de XML, o vuelve a comprimirlo. Pega XML para volver a sangrarlo con el espaciado que prefieras, o minificalo en una sola linea. El documento se comprueba mientras escribes y los contadores indican cuantos elementos contiene y cuanto se anida.

Formatear XML sin romperlo

En XML el espacio en blanco es contenido

Este es el hecho que separa el formateo de XML del de JSON. En JSON el espacio entre tokens carece de significado y eliminarlo siempre es seguro. En XML, los caracteres entre <name> y Ada forman parte del nodo de texto del elemento. Volver a sangrar un documento cambia, tecnicamente, lo que contiene.

En la practica casi nunca importa, porque la inmensa mayoria del XML usa contenido solo de elementos —elementos que contienen otros elementos y nada mas—, donde el espacio circundante es ignorable para cualquier esquema. El formateador solo anade sangria dentro de esos elementos. Cuando un elemento contiene texto real, o una mezcla de texto y elementos como hace el marcado tipo HTML, su contenido se deja exactamente como estaba. Esa unica regla evita que <p>Hello <b>there</b></p> gane espacios alrededor de there.

Bien formado no es lo mismo que valido

La comprobacion que se hace aqui es la de buena formacion, que es lo que la especificacion XML exige a todo parser: un unico elemento raiz, todas las etiquetas cerradas y correctamente anidadas, valores de atributo entrecomillados y & y < escapados dentro del texto. Si algo de eso falla, el documento se rechaza sin mas: XML es celebre por no tener recuperacion de errores, al contrario que HTML.

La validez es un paso mas: pregunta si el documento se ajusta a un DTD, un XSD o un esquema RelaxNG, de modo que <invoice> contenga realmente un <total> y la fecha sea realmente una fecha. Eso exige el esquema, que no forma parte del documento que pegas. Un resultado correcto aqui significa que la sintaxis es solida y que cualquier parser aceptara el archivo, no que el sistema receptor considere correcto el contenido.

Minificacion y etiquetas autocerradas

Minificar elimina el espacio ignorable entre elementos y deja todo el documento en una linea. Como ese espacio nunca fue contenido, una salida que partia de marcado solo de elementos se analiza y produce exactamente el mismo arbol.

El otro ahorro viene de los elementos vacios: la especificacion define <summary></summary> y <summary/> como identicos, y en la salida se usa la forma corta. La ganancia es real pero modesta: XML gasta la mayor parte de su tamano en nombres de etiqueta repetidos, ya que cada elemento escribe su nombre dos veces. Si un archivo debe ser realmente mas pequeno, la respuesta es gzip, que gestiona esos nombres repetidos mucho mejor que cualquier eliminacion de espacios. Conserva una copia formateada para leer, porque el XML minificado resulta casi ilegible.

Nota de codigo abierto: implementado en JavaScript puro sin librerias de terceros.

Preguntas frecuentes

Se sube mi XML a algun sitio?
No. El documento se analiza y se serializa en tu navegador con el DOMParser nativo, por lo que no se envia nada a ningun servidor.
El formateo cambia mi documento?
Solo dentro de elementos que no contienen mas que otros elementos, donde el espacio es ignorable. Los que tienen texto o contenido mixto se dejan intactos.
Valida esto contra un esquema?
No. Comprueba la buena formacion: etiquetas cerradas y bien anidadas, una raiz y caracteres escapados. Validar contra DTD o XSD requiere el propio esquema.
Por que se rechaza mi documento?
Suele ser una etiqueta sin cerrar o mal emparejada, un & o < sin escapar, un atributo sin comillas o mas de un elemento raiz. XML no recupera errores.
Que significan los contadores de elementos y profundidad?
Elementos es el numero total de nodos de elemento del documento. Profundidad es la cadena mas larga de anidamiento, contando la raiz como nivel uno.
Por que han cambiado de forma mis etiquetas vacias?
La especificacion XML define <a></a> y <a/> como identicos, asi que la salida minificada usa la forma autocerrada, mas corta, para ahorrar bytes.