Pular para o conteúdo principal

XML para CSV

Este conversor transforma XML em CSV RFC 4180 no seu navegador. Os filhos repetidos do elemento raiz se tornam linhas, seus atributos se tornam colunas prefixadas com @, e o texto do elemento vai para colunas nomeadas com terminações CRLF e aspas apenas onde a gramática exigir. Nada é enviado.

Só local

XML para CSV: explicação

A maioria dos XMLs reais que se comportam como uma tabela compartilham uma forma: um elemento contendo muitos filhos com o mesmo nome, cada filho representando um registro — um catálogo de livros, um log de entradas, uma lista de pedidos. Este conversor procura exatamente essa forma. Encontre o filho repetido da raiz e o resto é mecânico: cada filho se torna uma linha, seus atributos e elementos internos se tornam colunas, e a união de cada coluna em todas as linhas se torna o cabeçalho, na ordem em que foram vistos pela primeira vez.

As convenções são as mesmas que toda ponte XML usa, e são explicitadas aqui: um atributo mantém seu nome mas ganha um prefixo @, então id="bk101" se torna a coluna @id; o texto de um elemento se torna seu valor #text; e um elemento filho que se repete dentro de um registro explode em colunas indexadas, em vez de ser mesclado silenciosamente. O lado do CSV segue estritamente RFC 4180 — terminações de linha CRLF, escape de aspas duplas apenas quando um campo contém uma vírgula, aspa ou nova linha — e os valores cruzam como estão, sem coerção numérica para reformatar um CEP.

Tudo é executado nesta aba do navegador. O XML é analisado por um motor na página e o CSV é construído a partir da árvore analisada; nenhum dos dois toca a rede — abra o DevTools, veja o painel de Rede permanecer silencioso, e a afirmação se prova.

Construindo o XML a partir de uma exportação de planilha? O Conversor de CSV para XML aplica essas mesmas convenções na direção oposta.

O que o lado do CSV garante — aspas, CRLF, aspas duplicadas — está devidamente documentado no Guia RFC 4180 deste site.

Como a conversão realmente funciona

O documento é tokenizado uma vez em uma árvore, e a leitura tabular é um passo separado e honesto: a árvore ou tem a forma de filhos repetidos ou não tem, e fingir o contrário produziria um CSV que parece correto mas significa outra coisa. Quando a forma é encontrada, cada registro é achatado em caminhos de folha, e a linha de cabeçalho é a união ordenada desses caminhos em todos os registros — o primeiro visto primeiro, então a ordem das colunas é estável e previsível, não alfabética por acidente.

  • Análise: um analisador de única passagem constrói a árvore de elementos; comentários, DOCTYPE e instruções de processamento são ignorados, e um segundo elemento raiz é rejeitado com o número da linha.
  • Seleção: o primeiro elemento filho repetido da raiz fornece as linhas — <catalog> cheio de filhos <book> é o caso clássico.
  • Achatamento: atributos se tornam colunas @, texto de elemento se torna #text, e aninhamentos mais profundos se tornam caminhos com ponto como author.#text.
  • Emissão: uma linha terminada em CRLF por registro, campos entre aspas apenas quando uma vírgula, aspa ou nova linha o exigirem.

Como recursos XML mapeiam para colunas

O XML tem três formas de carregar um valor — atributos, conteúdo de texto e elementos filhos — e uma grade plana tem uma: uma coluna nomeada. O mapeamento abaixo é o padrão, escolhido para que nenhum dois recursos da fonte colidam na saída e para que o próprio cabeçalho diga de que tipo de valor cada coluna veio.

Construto XMLColunaExemplo de célula
atributo id="bk101"@idbk101
texto de elemento <price>5.95</price>price.#text5.95
elemento com atributos e texto@sku plus #textA-1, Widget
netos repetidosbook[0].#text, book[1].#textone, two

Valores cruzam como estão

Não há etapa de inferência de tipo entre a árvore XML e o CSV, deliberadamente. O texto XML é texto, então 44.95 chega como os caracteres 44.95, um CEP mantém seu zero à esquerda, e um valor como 1e5 não é expandido para 100000. Entidades são carregadas da mesma forma: o analisador não é um analisador validador e não reescreve referências a entidades, então o que chega em uma célula é exatamente o que o texto fonte continha. Se o destino precisar de valores tipados, combine esta ferramenta com o conversor de CSV para SQL, que infere tipos das células naquele ponto, onde a escolha é visível e reversível.

  • Números mantêm seus caracteres exatos — nenhuma precisão é inventada ou perdida.
  • Espaço em branco dentro de um nó de texto é preservado; espaço em branco entre elementos nunca se torna dado.
  • Elementos vazios (<debug/>) produzem uma coluna com célula vazia em vez de desaparecerem.

Onde este conversor se recusa a adivinhar

Duas estruturas forçariam o conversor a inventar informação, e ambas são rejeitadas com uma mensagem específica. A primeira é um documento sem elemento filho repetido — uma única raiz contendo nada tabulável não pode se tornar linhas sem inventar uma forma de linha. A segunda é um documento com mais de um elemento raiz, que não é um documento de todo; o erro nomeia o elemento ofensor e sua linha, e nada é escrito. Um fragmento que quase se encaixa ainda é um fragmento, e a correção mais rápida é deletar ou renomear o elemento wrapper antes de colar.

  • Sem filhos repetidos: erro nomeando a forma esperada <root><item>…</item></root>.
  • Múltiplas raízes: rejeitado, com o segundo elemento e sua linha reportados.
  • Tags de fechamento incompatíveis: rejeitado no ponto onde a árvore deixa de ser bem formada.

Perguntas frequentes

Converter XML para CSV envia meu arquivo para algum lugar?

Não. A análise do XML e a construção do CSV acontecem dentro desta aba do navegador com JavaScript que foi carregado uma vez quando a página abriu. Não há rota de API para enviar dados, e a Content-Security-Policy da página define connect-src 'self', então o navegador bloquearia qualquer requisição de saída. Ambas as afirmações são verificáveis no DevTools: veja o painel de Rede enquanto converte — nenhuma requisição aparece.

Quais elementos XML se tornam as linhas do CSV?

O conversor olha para os filhos do elemento raiz e pega o repetido — o elemento com o mesmo nome que aparece muitas vezes, como <book> dentro de <catalog>. Cada ocorrência se torna uma linha. Se nenhum filho se repete, cada filho com formato de objeto é tratado como seu próprio registro, e uma raiz com nada tabulável dentro é rejeitada com um erro nomeado, em vez de ser achatada em um arquivo de uma linha enganoso.

Por que alguns nomes de coluna começam com @ ou contêm #text?

Os prefixos registram onde cada valor estava no XML. Um prefixo @ marca um atributo — id="bk101" se torna a coluna @id — e #text marca o próprio texto de um elemento, que precisa de um nome próprio quando o elemento também tem atributos ou filhos. Os prefixes evitam colisões: um elemento chamado id e um atributo chamado id competiriam por uma coluna, e o cabeçalho não diria qual era qual.

Números são convertidos, ou os valores ficam como escritos?

Valores ficam exatamente como escritos. A árvore mantém texto como strings e o escritor de CSV não faz inferência de tipo, então 44.95 cruza como 44.95, um CEP como 02134 mantém seu zero à esquerda, e nada é reformatado atrás de suas costas. Esta é a mesma política que o conversor XML para YAML do site segue, então um arquivo convertido de qualquer um dos lados mostra os mesmos valores caractere por caractere.

Campos entre aspas e quebras de linha são tratadas na saída?

Segundo RFC 4180: um campo contendo uma vírgula, uma aspa dupla ou uma nova linha é envolto em aspas duplas, e uma aspa dentro de tal campo é duplicada. Linhas terminam com CRLF, o terminador que a especificação define e que o software de planilha espera. Campos são colocados entre aspas apenas quando a gramática o exige — sem aspas decorativas — o que mantém o arquivo menor e mais fácil de diff que uma exportação que aspa tudo.

O que acontece com comentários XML e a linha DOCTYPE?

Eles são ignorados. Comentários, a declaração DOCTYPE e instruções de processamento não carregam dado tabular, então a árvore simplesmente nunca os inclui; a análise continua a partir da estrutura do elemento. A única coisa que o conversor insiste é em um único elemento raiz — um documento com um segundo elemento de nível superior é rejeitado com o nome do elemento e número da linha, porque duas raízes são dois documentos, não um conjunto de linhas.