Convertire XML in NDJSON

Qui converti XML in NDJSON gratis e senza account: trascina il file qui sopra e in un paio di secondi il risultato è pronto da scaricare. La conversione avviene dentro il tuo browser, quindi il file non viene mai caricato. Funziona allo stesso modo su Windows, macOS e Linux e anche su iPhone e Android, e continua a funzionare anche se stacchi la connessione.

  • Dove gira Nel tuo browser. Il file non viene mai caricato.
  • Ricostruito NDJSON funziona in modo diverso da XML. Non è quindi il degrado graduale di un codec con perdita: quello che NDJSON sa esprimere viene riprodotto fedelmente, e quello che lì non ha un equivalente non sopravvive affatto.
  • Limite di dimensione Fino a 100 MB per file, gratis e senza account.
  • Vale la pena saperlo Attributi e nodi di testo dell’XML diventano entrambi chiavi, ed è una decisione che il convertitore prende al posto tuo.

Fino a 100 file alla volta. Formati diversi insieme non sono un problema.

Perché un documento XML diventa sempre esattamente una riga

NDJSON ha bisogno di qualcosa su cui dividersi, e la divisione qui avviene su una lista all'esterno dei dati analizzati. Analizzare XML non ne produce mai una: il risultato è sempre un oggetto con una sola chiave, il nome dell'elemento radice, che contiene tutto il resto. Un valore in ingresso, una riga in uscita.

Vale a prescindere da quanto sia grande il file e da quanti elementi ripetuti contenga. Un'esportazione da 40 MB di diecimila record converte in una singola riga da 40 MB. Nulla si perde e nulla si divide, e se servivano diecimila righe, questa conversione non lo ha fatto.

Ottenere una riga per record da un'esportazione XML

La via che funziona sono due passi. Si converte il file in JSON, poi lo si esegue attraverso jq: si seleziona il percorso che contiene l'elemento ripetuto, lo si itera, e si usa il flag di output compatto così che ogni oggetto atterri sulla propria riga. È un comando, è ripetibile in uno script, e mette la scelta di cosa conti come record dove appartiene — a chi lo fa.

Nessun convertitore può fare quella scelta dal solo documento. In un feed RSS il record è l'elemento item; in una risposta SOAP potrebbe essere una riga tre livelli dentro il body; in un'esportazione bancaria è qualunque cosa il fornitore abbia deciso di chiamare transazione. Uno strumento che indovinasse sarebbe giusto abbastanza spesso da essere considerato affidabile e sbagliato abbastanza spesso da corrompere un caricamento.

I casi in cui una riga per file è esattamente giusto

Non è una coppia senza uso. Se i propri input sono molti piccoli documenti XML invece di uno grande — una directory di fatture, una cartella di manifesti, un lotto di payload per evento — allora una riga per file è precisamente la forma che vuole un caricatore, e concatenare gli output produce uno stream NDJSON valido con un record per documento sorgente.

Funziona anche per l'inventario. Convertire ogni file config in un repository e aggiungere le righe dà un dataset interrogabile di cosa contengono quei file, una cosa genuinamente utile da avere e difficile da ottenere altrimenti. In entrambi i casi la conversione sta facendo il suo lavoro e la singola riga è la funzione.

Il problema di forma che segue un record XML in JSON

Anche dopo aver diviso i record, un comportamento XML li segue. Un elemento ripetuto diventa un array solo quando si ripete: un record che contiene un elemento tag produce una stringa, e un record che ne contiene due produce una lista di stringhe. Dentro una singola esportazione, alcune righe avranno l'array e altre no.

Un archivio schema-on-read dedurrà un tipo dai primi record che vede e poi rifiuterà o coercirà il resto. Il rimedio appartiene al passaggio jq piuttosto che al caricatore: si normalizza ogni campo che può ripetersi in un array mentre si emette ogni riga, così lo stream è uniforme prima che qualcosa a valle lo veda.

Cosa contiene davvero la riga

JSON compatto senza indentazione, chiavi nell'ordine del documento, terminato da un a capo. Gli attributi appaiono come chiavi prefissate con @ e il testo dell'elemento su un tag che ha anche attributi appare sotto #text. Un prefisso namespace resta dentro il nome della chiave, quindi soap:Body è una chiave con i due punti dentro, e un documento con una dichiarazione XML porta una chiave extra di primo livello chiamata ?xml.

Queste ultime due valgono la pena rimuoverle prima di un caricamento. Nomi di campo con due punti e punti interrogativi sono scomodi o non validi in un buon numero di motori di query e schemi tabella, e la dichiarazione è metadato sul file piuttosto che dato da esso.

I tipi come arrivano da un parser XML

I valori dall'aspetto numerico vengono analizzati, sia negli attributi sia nel testo degli elementi. È comodo per un conteggio e distruttivo per gli identificatori: un riferimento d'ordine scritto 007 arriva come il numero 7, e un attributo di versione scritto 1.0 arriva come 1. In un data store diventano colonne numeriche e il riempimento sparisce da ogni riga.

Un caso si comporta meglio di quanto si potrebbe temere: un intero troppo lungo per sopravvivere come numero JSON viene lasciato come stringa invece che arrotondato, quindi un riferimento a diciannove cifre passa intatto. La notazione scientifica non ha quella protezione — un valore scritto 1e3 arriva come 1000. Nessun errore viene sollevato in nessuno dei due casi. Se l'esportazione contiene numeri di riferimento su cui si farà una join in seguito, li si riconverte in stringhe nel passaggio jq, prima del primo caricamento invece che dopo.

Caricare il risultato, e la lunghezza di riga che nessuno pianifica

NDJSON viene letto direttamente da jq, da pandas con la sua opzione lines, e come formato di caricamento dai comuni caricatori di data warehouse. Il bulk di Elasticsearch richiede una riga azione prima di ogni documento, aggiunta nello stesso passaggio jq che divide i record.

La cosa da pianificare con questa coppia specificamente è la lunghezza di riga. Un lettore che elabora una riga alla volta deve tenere l'intera riga in memoria, quindi una riga a documento intero è un buffer a documento intero, e qualsiasi limite di dimensione per record nella destinazione si applica al file completo piuttosto che a un record. È il motivo pratico per dividere i record prima di caricare invece che dopo.

Quando un parser XML in streaming è la risposta giusta invece

Se l'esportazione è grande, arriva regolarmente, e deve diventare uno stream ogni volta, il consiglio onesto non è affatto un convertitore browser. Un parser in streaming legge un file XML elemento per elemento senza costruire l'intero albero in memoria, ed emettere una riga JSON per record da quel ciclo è un programma breve in qualsiasi linguaggio.

Quell'approccio sopravvive anche a file più grandi della memoria, cosa che nulla su questa pagina fa — l'analisi qui costruisce l'intero documento come oggetti JavaScript prima che un solo byte venga scritto. Per un file una tantum, o per i casi per-file sopra, il convertitore è più veloce che scrivere il programma. Per una pipeline ricorrente no.

Commenti, e cosa non può contenere un file delimitato da righe

I commenti XML vengono scartati durante l'analisi e NDJSON non ha sintassi commenti per riceverli, quindi qualsiasi documentazione dentro l'esportazione sparisce. Non c'è nemmeno intestazione, schema o preambolo: ogni riga in un file NDJSON è un record, e un caricatore proverà a leggere qualsiasi cosa in cima al file come tale.

Se il caricamento deve registrare da dove vengono i dati, appartiene a un campo sul record o al nome del file. Aggiungerlo come prima riga rende il file non valido per il suo scopo, e il caricatore lo dirà in un modo molto meno chiaro di questo paragrafo.

Come convertire XML in NDJSON

  1. Trascina il tuo file XML su questa pagina, oppure fai clic per sceglierne uno.
  2. Scegli NDJSON come destinazione. La conversione avviene nel tuo browser e il file non viene caricato.
  3. Scarica il file NDJSON finito.

XML o NDJSON: cosa cambia

XML a confronto con NDJSON
XMLNDJSON
Nome completoExtensible Markup LanguageNewline-Delimited JSON
Estensione del file.xml.ndjson, .jsonl
Tipo di mediaapplication/xmlapplication/x-ndjson
Prima pubblicazione19982013
Pubblicato daW3C
SpecificaXML 1.0
LicenzaStandard apertoStandard aperto
Situazione attualeAttualeAttuale
Si apre nel browserTutti i browserNessun browser
Valutato al suo postoJSON, YAMLJSON, CSV

Che cosa si perde

I commenti non sopravvivono. XML permette di annotare un file e NDJSON non ha una sintassi per farlo, quindi ogni riga di spiegazione sparisce — e tocca proprio i file che si commentano: la configurazione che qualcun altro dovrà mantenere.

Aprire il risultato

Nessun browser legge NDJSON. È il meno trasportabile dei due: meglio assicurarsi che chi lo riceve lo accetti prima di inviarlo.

I programmi di sempre non coincidono: XML si apre in Visual Studio Code e oXygen XML Editor, NDJSON in jq e pandas, quindi chi riceve il risultato ha bisogno di uno del secondo gruppo.

A che cosa serve ciascun formato

XML è il formato di W3C, pubblicato nel 1998. È descritto in XML 1.0, e vale la pena conoscerlo se il file deve sopravvivere allo strumento che lo ha scritto.

NDJSON risale al 2013. jq e pandas lo leggono.

XML è stato pubblicato nel 1998 e NDJSON nel 2013. Il più vecchio è in genere il file più sicuro da consegnare; il più recente fa lo stesso lavoro con meno byte.

Da XML a NDJSON: domande frequenti

Il mio file XML viene caricato da qualche parte?

No. Questa conversione avviene interamente nel tuo browser, quindi il file non esce dal tuo dispositivo. Puoi controllarlo da solo: apri la scheda di rete degli strumenti per sviluppatori e converti qualcosa. Vedrai la pagina stessa e le richieste di statistica e di pubblicità con cui questo servizio si paga, e nemmeno una che porti il tuo file.

Convertire XML in NDJSON è gratis?

Sì. Senza account, senza filigrana e senza una quota giornaliera da consumare: gira sulla tua macchina, quindi puoi tornare quante volte vuoi. Il browser lavora file fino a 100 MB, 100 per volta.

Si perde qualità convertendo XML in NDJSON?

XML e NDJSON descrivono il contenuto in modi radicalmente diversi. La conversione è quindi una ricostruzione e non una copia: fedele, ma non identica byte per byte. Attributi e nodi di testo dell’XML diventano entrambi chiavi, ed è una decisione che il convertitore prende al posto tuo.

Un file NDJSON si apre nel browser?

Nessun browser legge NDJSON. È il meno trasportabile dei due: meglio assicurarsi che chi lo riceve lo accetti prima di inviarlo.

I commenti sopravvivono da XML a NDJSON?

I commenti non sopravvivono. XML permette di annotare un file e NDJSON non ha una sintassi per farlo, quindi ogni riga di spiegazione sparisce — e tocca proprio i file che si commentano: la configurazione che qualcun altro dovrà mantenere.

Altro su questi formati