Pular para o conteúdo principal

CSV para XML

Este conversor transforma linhas CSV em elementos XML no seu navegador: um elemento raiz <records>, um elemento <record> por linha e uma tag filha por cabeçalho. Nomes de tags são sanitizados para XML válido, o texto é escapado e cabeçalhos com pontos são aninhados em elementos filhos. Nada é enviado.

Só local

CSV para XML: explicação

XML é mais rigoroso que CSV quanto aos nomes, e essa rigidez é o problema de engenharia aqui. Um cabeçalho como unit price não pode se tornar uma tag porque nomes de elementos não podem conter espaços; 2fa não pode se tornar uma tag porque nomes não podem começar com um dígito. Este conversor aplica o remédio padrão — caracteres inválidos se tornam underscores e um nome que começaria com dígito ganha um underscore inicial — para que cada cabeçalho produza uma tag que um parser XML real aceite, e o mapeamento da coluna para o elemento permanece visível em vez de mágico.

O lado do CSV é parseado de acordo com a RFC 4180: uma máquina de estados que respeita aspas duplas, vírgulas e novaslinhas dentro de campos entre aspas, detecção de delimitadores entre vírgula, ponto e vírgula, tabulação e pipe, e a mesma política de tipo restritiva que o site usa em todo lugar — valores se tornam números apenas sob a gramática de número do JSON, então 02134 mantém seu zero à esquerda. Cabeçalhos com pontos mantêm sua estrutura: address.city se torna um elemento address com um filho city, não uma tag plana com um ponto no nome.

Tudo é executado nesta aba do navegador. O CSV é parseado por um motor na página e o XML é construído a partir dos registros parseados; nada toca a rede — abra o DevTools, veja o painel de Rede ficar silencioso e a afirmação de privacidade se autoverifica.

Verificar a viagem de ida e volta é só um colar, porque o Conversor de XML para CSV lê essas mesmas convenções ao contrário, linhas de volta para fora dos elementos.

Se a escolha do formato de saída ainda estiver em aberto, o Comparação JSON vs XML explica onde a marcação se justifica e onde é sobrecarga.

Como a conversão realmente funciona

O pipeline é parsear, expandir, sanitizar, escapar — nessa ordem, e cada estágio só vê a saída do anterior. Essa ordem é por que uma vírgula dentro de uma célula entre aspas nunca perturba a estrutura do elemento: a grade é resolvida antes de qualquer XML existir, e o escritor de XML nunca toma decisões sobre sintaxe de CSV.

  • Parsear: regras RFC 4180 com as permissões do mundo real — uma aspa no meio de um campo nu é levada literalmente, e linhas vazias no final são descartadas.
  • Expandir: cabeçalhos são decodificados como caminhos, então address.city aninha city dentro de address, e tags[0], tags[1] se tornam elementos repetidos.
  • Sanitizar: cada nome de elemento é verificado contra as regras de nome XML 1.0 — letras, dígitos, underscores, hífens, pontos e dois-pontos — e reparado onde falhar.
  • Escapar: o conteúdo de texto recebe &amp;, &lt; e &gt; onde a fonte tinha &, < ou >, e valores de atributo adicionalmente escapam as aspas duplas.

A política de nomes de tag, precisamente

XML 1.0 permite que um nome comece com uma letra, underscore ou dois-pontos, e permite que ele continue com dígitos, hífens e pontos; tudo o mais é inválido. O sanitizador substitui cada caractere fora desse conjunto por um underscore e prefixa um underscore quando o primeiro caractere sobrevivente seria um dígito — então unit price se torna unit_price, 2fa se torna _2fa, e uma coluna chamada discount% se torna discount_. Nomes válidos passam intocados, incluindo CamelCase e kebab-case, porque reescrever um nome que já era legal quebraria consumidores que o esperam.

Cabeçalho CSVElemento emitidoPor quê
name<name>já um nome XML legal — passou sem alterações
unit price<unit_price>espaço substituído por underscore
2fa<_2fa>nomes não podem começar com dígito
address.city<address><city>cabeçalhos com pontos são aninhados, não achatados

O que acontece com os valores

XML não tem tipo número ou booleano separado — todo valor é texto — então células cruzam como seus caracteres exatos, sem coerção para perder ou inventar precisão. Uma célula vazia é tratada como campo ausente em vez de valor vazio, então o elemento é omitido em vez de emitir uma tag autofechada de string que ninguém consome. O escape é aplicado na saída: uma célula contendo A & B se torna A &amp; B no documento, e qualquer parser XML lendo o resultado vê o texto original novamente.

  • 02134 fica 02134; nenhum zero à esquerda é cortado, porque o valor é texto desde que deixa a grade.
  • Uma célula com múltiplas linhas mantém suas quebras de linha dentro do elemento, e essas quebras são dados, não formatação.
  • O elemento <record> é o mesmo para cada linha, irregular ou não — colunas que uma linha simplesmente não possui não produzem nenhum elemento.

Casos extremos e como são reportados

As recusas do conversor são a parte de seu contrato que sustenta. Um campo entre aspas não terminado interrompe o parse naquela linha com um erro nomeado, porque adivinhar onde o campo terminaria redimensionaria silenciosamente cada linha depois. Uma linha com contagem de campo diferente do cabeçalho ainda converte, mas um aviso informa que campos ausentes estão ausentes e extras foram descartados. Cabeçalhos duplicados convertem com o valor da ocorrência mais à direita vencendo, e o aviso diz isso — o comportamento de importação de planilha, tornado explícito.

  • Aspa não terminada: parse abortado, linha reportada, nenhuma saída escrita.
  • Linhas irregulares: convertidas com aviso nomeando as linhas afetadas.
  • Cabeçalhos duplicados: convertidos com aviso; ocorrência mais à direita vence.

Perguntas frequentes

Converter CSV para XML envia meu arquivo para algum lugar?

Não. O parse do CSV e a construção do XML são executados dentro desta aba do navegador com código que foi carregado uma vez ao abrir a página. Não há endpoint de envio para chamar, e a página é servida com uma Content-Security-Policy cujo connect-src é 'self', então o navegador recusaria qualquer requisição de saída mesmo se tentada. Veja o painel de Rede no DevTools enquanto converte — ele fica vazio.

Por que minha saída está embrulhada em tags <records> e <record>?

XML precisa exatamente de um elemento raiz, e um arquivo CSV não tem nome natural para dar a ele, então o conversor usa uma forma fixa: um elemento raiz <records> com um elemento <record> por linha. Cabeçalhos se tornam as tags filhas dentro de cada registro. O wrapper é que torna a saída um documento bem formado em vez de um fragmento, e cada linha é fácil de endereçar com um XPath como /records/record.

Nomes de tag ilegais são como tratados?

Todo cabeçalho é sanitizado para as regras de nome XML 1.0: caracteres fora de letras, dígitos, underscore, hífen, ponto e dois-pontos se tornam underscores, e um nome que começaria com dígito ganha um underscore inicial. Então unit price se torna unit_price e 2fa se torna _2fa. Nomes que já eram legais passam intocados, o que importa quando um sistema downstream faz match em nomes de tag exatos.

Caracteres especiais nos valores das células são como escapados?

O conteúdo de texto escapa os três caracteres que XML requer: & se torna &amp;, < se torna &lt; e > se torna &gt>. Dentro de valores de atributo a aspa dupla é escapada como &quot; também. O escape acontece apenas na saída, então uma célula contendo A & B faz a viagem de volta para exatamente A & B quando um parser XML lê o documento — nada é escapado duas vezes e nada é pré-desescapado.

Meus números e códigos postais manterão sua formatação?

Sim, porque valores se tornam texto XML verbatim — não há etapa de coerção numérica que pudesse reformata-los. 02134 mantém seu zero à esquerda, 44.95 mantém sua forma decimal exata, e um valor como 1e5 permanece os caracteres que você digitou em vez de ser expandido. Informação de tipo é uma preocupação de CSV ou JSON; elementos XML carregam texto, e o conversor não segunda-guessa isso.

E se meu CSV tiver linhas irregulares ou cabeçalhos duplicados?

Ambos convertem, cada um com um aviso explícito. Uma linha mais curta que o cabeçalho é completada com campos ausentes — nenhum elemento vazio é inventado — e uma linha mais longa que o cabeçalho tem seus extras descartados, com o aviso nomeando quantas linhas foram afetadas. Nomes de coluna duplicados resolvem com o da direita vencendo, da mesma forma que uma importação de planilha se comporta, e o aviso lista os nomes envolvidos.