Formattatore XML
Incolla l’XML e ottienilo indentato, oppure trova il tag che lo ha rotto.
Che cos'è un formattatore XML?
Un formattatore XML indenta un documento così da rendere visibile l'annidamento degli elementi, e sa fare anche il contrario, togliendo gli spazi per rendere il file più piccolo. Cambia solo l'impaginazione: elementi, attributi e testo restano identici.
Come funziona
Il formattatore percorre il documento tag per tag e lo reindenta: un livello di rientro per livello di annidamento, un elemento per riga, con i valori brevi tenuti sulla stessa riga dei tag che li racchiudono.
Tiene una pila di ciò che è aperto. Un tag di chiusura che non corrisponde alla cima della pila è l’errore, e il tag che indica è quasi sempre il punto dello sbaglio: molto più utile di un «non ben formato» alla fine del file.
Commenti e sezioni CDATA finiscono con il proprio terminatore e non con la prima parentesi angolare successiva, quindi un > al loro interno non spezza mai il documento nel punto sbagliato.
Che cosa fa un formattatore XML, e cosa vuol dire «ben formato»
L’XML che esce da un sistema è di solito una riga unica, perché gli spazi tra gli elementi non hanno significato e chi lo genera non ha motivo di aggiungerne. Un formattatore rimette quella struttura sullo schermo: un elemento per riga, rientrato in base alla profondità, così la forma del documento si vede a colpo d’occhio.
Per farlo bisogna capire l’annidamento, ed è per questo che lo stesso strumento risponde anche all’altra domanda con cui si arriva: è ben formato? «Ben formato» è il più basso dei due livelli che l’XML prevede. Significa che ogni tag aperto è chiuso, che le chiusure sono nell’ordine giusto, che gli attributi sono tra virgolette e che c’è un solo elemento radice. Non dice nulla su quanto il documento rispetti uno schema: quella è la validità, un controllo diverso e più grande che richiede l’XSD o la DTD.
Le quattro cose che rompono un file XML
- Un tag non chiuso di gran lunga il più comune, ed è il motivo per cui l’errore punta così spesso alla fine del file: il parser ha continuato a leggere finché il documento non è finito. Qui viene indicato invece il tag rimasto aperto, che è dove guardare.
- Tag chiusi in ordine sbagliato <b><i>testo</b></i> è accettabile nell’HTML tollerante e non è mai valido in XML. Gli elementi si annidano, non si sovrappongono.
- Una & o un < non codificati dentro il testo sono markup, non caratteri. Scrivi & e <, oppure metti il testo in una sezione CDATA.
- Più di un elemento radice un documento XML ne ha esattamente uno. Due elementi di primo livello di solito significano due documenti concatenati: un incidente frequente quando un log viene costruito in append.
Formattare, minificare, e quando serve l’uno o l’altro
Indentare serve a leggere e a confrontare. Un file formattato si confronta riga per riga, quindi una modifica appare come le righe cambiate invece che come un’unica riga enorme che differisce. Formatta entrambi i lati prima di un diff e il confronto diventa utile.
Minificare serve a spedire. Gli spazi tra gli elementi in XML non sono significativi, quindi toglierli non perde nulla della struttura e può alleggerire sensibilmente una busta SOAP o un feed RSS. L’unica cautela riguarda il contenuto misto, elementi che contengono sia testo sia figli, come in XHTML, dove gli spazi tra le parole stanno dentro il testo e devono sopravvivere: questo strumento tocca solo gli spazi tra i tag, mai quelli dentro il testo.
XML accanto a JSON
I due formati rispondono a domande diverse, e un file nell’uno è raramente un file pulito nell’altro. L’XML ha attributi, namespace, commenti, istruzioni di elaborazione, contenuto misto e un linguaggio di schema; il JSON ha oggetti, array e quattro tipi scalari. Convertire XML in JSON costringe a una decisione su ognuna di quelle caratteristiche: un attributo diventa una chiave con la @ davanti? che ne è di un namespace? un singolo figlio è un oggetto o un array di uno?, e convertitori diversi decidono diversamente: è per questo che un giro di andata e ritorno attraverso il JSON raramente restituisce l’XML di partenza.
Oggi l’XML lo si incontra dove c’era prima del JSON o dove serve ciò che al JSON manca: servizi SOAP, feed RSS e Atom, sitemap, layout Android, configurazioni Maven e Spring, documenti Office, SVG. Quasi tutti hanno uno schema, che è esattamente la cosa che l’XML ha e il JSON in gran parte no.
Controllare un file che non dovresti caricare
Tutto avviene nella pagina. Non viene inviato niente a un server, quindi una risposta SOAP con i dati dei clienti, un file di configurazione con una stringa di connessione o un export da un sistema di produzione si possono formattare senza che nulla lasci il tuo computer, e lo strumento continua a funzionare anche con la rete staccata.
È la differenza che per l’XML conta in modo particolare, perché l’XML è dove vivono le integrazioni vecchie, e le integrazioni vecchie sono dove stanno i payload sensibili. Un formattatore online che invia a un backend ha già ricevuto il documento, e quello che registra se lo tiene.
Domande frequenti
Perché l’errore XML punta all’ultima riga?
Perché un tag più sopra non è mai stato chiuso e il parser ha continuato a leggere fino a esaurire il documento. Questo strumento indica invece il tag rimasto aperto, che è dove sta davvero l’errore.
Il mio XML viene caricato?
No. La formattazione avviene nel browser, non viene inviato niente e lo strumento funziona anche offline. Puoi incollare in sicurezza una risposta SOAP di produzione.
Che differenza c’è tra ben formato e valido?
Ben formato significa che la sintassi regge: tag chiusi, annidamento corretto, una sola radice. Valido significa che rispetta anche uno schema, cioè gli elementi giusti nell’ordine giusto con i tipi giusti. Qui si controlla il primo; il secondo richiede il tuo XSD o la tua DTD.
Minificare cambia i miei dati?
No. Toglie solo gli spazi tra i tag, che in XML non sono significativi. Il testo dentro un elemento resta esattamente com’è, quindi il contenuto misto sopravvive.
Posso convertire l’XML in JSON?
Non qui, ed è voluto: attributi, namespace e contenuto misto non hanno una sola risposta giusta in JSON, quindi ogni convertitore sceglie diversamente e un giro completo raramente restituisce ciò da cui eri partito.