Converter XML para NDJSON

Aqui você converte XML para NDJSON de graça e sem conta: solte o arquivo acima e em poucos segundos o resultado está pronto para baixar. A conversão acontece dentro do seu próprio navegador, então o arquivo nunca é enviado. Funciona igual no Windows, no macOS e no Linux e também no iPhone e no Android, e continua funcionando mesmo se você cortar a conexão.

  • Onde roda No seu navegador. O arquivo nunca é enviado.
  • Reconstruído NDJSON funciona de um jeito diferente de XML. Não é a degradação gradual de um codec com perda: o que NDJSON consegue expressar é reproduzido fielmente, e o que não tem equivalente ali não sobrevive de jeito nenhum.
  • Limite de tamanho Até 100 MB por arquivo, de graça e sem conta.
  • Vale saber Atributos e nós de texto do XML viram ambos chaves, e essa é uma decisão que o conversor toma por você.

Até 100 arquivos de uma vez. Formatos misturados não são problema.

Por que um documento XML sempre vira exatamente uma linha

JSON delimitado por linha precisa de algo para dividir, e a divisão aqui acontece num array no topo dos dados interpretados. Interpretar XML nunca produz um: o resultado é sempre um objeto com uma chave só, o nome do elemento raiz, guardando tudo mais. Um valor entra, uma linha sai.

Isso vale mesmo que o arquivo seja grande e contenha muitos elementos repetidos. Uma exportação de 40 MB com dez mil registros converte numa única linha de 40 MB. Nada é perdido e nada é dividido, e se o que você precisava era dez mil linhas, esta conversão não fez isso.

Chegando a uma linha por registro a partir de uma exportação XML

A rota que funciona são dois passos. Converta o arquivo para JSON, depois passe por jq: selecione o caminho carregando o elemento repetido, itere, e use a flag de saída compacta para que cada objeto fique na própria linha. É um comando só, é repetível num script, e coloca a escolha do que conta como registro onde ela pertence — com você.

Nenhum conversor consegue fazer essa escolha a partir do documento sozinho. Num feed RSS o registro é o elemento item; numa resposta SOAP pode ser uma linha três níveis dentro do body; num extrato bancário é o que o fornecedor decidiu chamar de transação.

Os casos em que uma linha por arquivo é exatamente certo

Este não é um par sem uso. Se suas entradas são muitos documentos XML pequenos em vez de um grande — um diretório de faturas, uma pasta de manifestos, um lote de payloads por evento — então uma linha por arquivo é precisamente o formato que um carregador quer.

Também funciona para inventário. Converter cada arquivo de configuração num repositório e anexar as linhas dá um conjunto de dados consultável sobre o que esses arquivos contêm.

O problema de forma que segue um registro XML para dentro do JSON

Mesmo depois de você dividir os registros, um comportamento XML os segue. Um elemento repetido vira um array só quando se repete: um registro contendo um elemento tag produz uma string, e um registro contendo dois produz uma lista de strings.

Um armazenamento de esquema na leitura vai inferir um tipo a partir dos primeiros registros que vê e depois rejeitar ou converter à força o resto. O conserto pertence à passagem de jq em vez de ao carregador: normalize todo campo que pode se repetir em array conforme você emite cada linha.

O que a linha realmente contém

JSON compacto sem indentação, chaves na ordem do documento, terminado por uma quebra de linha. Atributos aparecem como chaves prefixadas com @ e texto de elemento numa tag que também tem atributos aparece sob #text. Um prefixo de namespace fica dentro do nome da chave, então soap:Body é uma chave com dois-pontos nela.

Essas duas últimas valem remover antes de uma carga. Nomes de campo contendo dois-pontos e ponto de interrogação são incômodos ou inválidos em bastante motor de consulta e esquema de tabela, e a declaração é metadado sobre o arquivo em vez de dado dele.

Tipos conforme chegam de um interpretador XML

Valores que parecem numéricos são interpretados, tanto em atributos quanto em texto de elemento. Isso é conveniente para uma contagem e destrutivo para identificadores: uma referência de pedido escrita 007 chega como o número 7, e um atributo de versão escrito 1.0 chega como 1.

Um caso se comporta melhor do que se poderia temer: um inteiro longo demais para sobreviver como número JSON é deixado como string em vez de arredondado, então uma referência de dezenove dígitos chega intacta. Notação científica não recebe essa proteção — um valor escrito 1e3 chega como 1000.

Carregando o resultado, e o comprimento de linha que ninguém planeja

NDJSON é lido diretamente por jq, por pandas com sua opção de linhas, e como formato de carga pelos carregadores de data warehouse comuns. Bulk do Elasticsearch precisa de uma linha de ação antes de cada documento, acrescentada na mesma passagem de jq.

O que vale planejar com este par especificamente é o comprimento da linha. Um leitor que processa uma linha por vez precisa segurar a linha inteira em memória, então uma linha de documento inteiro é um buffer de documento inteiro.

Quando um interpretador XML em streaming é a resposta certa em vez disso

Se a exportação é grande, chega regularmente, e precisa virar um fluxo toda vez, a recomendação honesta não é um conversor de navegador de jeito nenhum. Um interpretador XML em streaming lê um arquivo elemento por elemento sem montar a árvore inteira em memória.

Essa abordagem também sobrevive a arquivos maiores que memória, o que nada nesta página faz — a interpretação aqui monta o documento inteiro como objetos JavaScript antes de um único byte ser escrito. Para um arquivo único, o conversor é mais rápido que escrever o programa.

Comentários, e o que um arquivo delimitado por linha não consegue guardar

Comentários XML são descartados durante a interpretação e NDJSON não tem sintaxe de comentário para recebê-los, então qualquer documentação dentro da exportação se foi. Também não há cabeçalho, esquema nem preâmbulo: toda linha num arquivo NDJSON é um registro.

Se a carga precisa registrar de onde os dados vieram, isso pertence a um campo no registro ou ao nome do arquivo. Acrescentar como primeira linha torna o arquivo inválido para seu propósito.

Como converter XML para NDJSON

  1. Solte o seu arquivo XML nesta página, ou clique para escolher um.
  2. Escolha NDJSON como destino. A conversão acontece no seu navegador e o arquivo não é enviado.
  3. Baixe o arquivo NDJSON pronto.

XML ou NDJSON: o que muda

XML comparado com NDJSON
XMLNDJSON
Nome completoExtensible Markup LanguageNewline-Delimited JSON
Extensão do arquivo.xml.ndjson, .jsonl
Tipo de mídiaapplication/xmlapplication/x-ndjson
Publicado pela primeira vez19982013
Publicado porW3C
EspecificaçãoXML 1.0
LicençaPadrão abertoPadrão aberto
Situação hojeAtualAtual
Abre no navegadorTodos os navegadoresNenhum navegador
Considerado no lugarJSON, YAMLJSON, CSV

O que se perde

Os comentários não sobrevivem. XML permite anotar um arquivo e NDJSON não tem sintaxe para isso, então cada linha de explicação se perde — e isso atinge justamente os arquivos que se comentam: configuração que outra pessoa vai manter.

Abrir o resultado

Nenhum navegador lê NDJSON. É o menos portátil dos dois, então vale confirmar que o destinatário aceita antes de enviar.

Os programas de sempre não se cruzam: XML abre em Visual Studio Code e oXygen XML Editor, e NDJSON em jq e pandas, então quem receber o resultado precisa de algum do segundo grupo.

Para que serve cada formato

XML é o formato da W3C, publicado em 1998. Está descrito em XML 1.0, e vale conhecer se o arquivo precisa sobreviver à ferramenta que o escreveu.

NDJSON e de 2013. jq e pandas leem o formato.

XML foi publicado em 1998 e NDJSON em 2013. O mais antigo costuma ser o arquivo mais seguro para entregar; o mais novo faz o mesmo com menos bytes.

De XML para NDJSON: perguntas frequentes

Meu arquivo XML é enviado para algum lugar?

Não. Esta conversão acontece inteiramente no seu navegador, então o arquivo não sai do seu aparelho. Você mesmo pode conferir: abra a aba de rede das ferramentas de desenvolvedor e converta alguma coisa. Você verá a própria página e as requisições de estatística e de publicidade com que este serviço é pago, e nenhuma que leve o seu arquivo.

Converter XML para NDJSON é grátis?

É. Sem conta, sem marca d’água e sem cota diária para gastar: roda no seu próprio aparelho, então você pode voltar quantas vezes quiser. O navegador processa arquivos de até 100 MB, 100 por vez.

Perde qualidade ao converter XML para NDJSON?

XML e NDJSON descrevem o conteúdo de maneiras radicalmente diferentes. A conversão é, portanto, uma reconstrução e não uma cópia: fiel, mas não idêntica byte a byte. Atributos e nós de texto do XML viram ambos chaves, e essa é uma decisão que o conversor toma por você.

Um arquivo NDJSON abre no navegador?

Nenhum navegador lê NDJSON. É o menos portátil dos dois, então vale confirmar que o destinatário aceita antes de enviar.

Os comentários sobrevivem de XML para NDJSON?

Os comentários não sobrevivem. XML permite anotar um arquivo e NDJSON não tem sintaxe para isso, então cada linha de explicação se perde — e isso atinge justamente os arquivos que se comentam: configuração que outra pessoa vai manter.

Mais sobre esses formatos