Conversor Elixir para XML
Cole structs ou maps de Elixir. Receba XML limpo de volta.
O que esta ferramenta faz
Você está ligando um app Elixir a um endpoint SOAP legado, ou montando uma fixture para um teste de integração XML-RPC, e tem o struct mas não o envelope. Escrever à mão chamadas XmlBuilder.element/3 para cada campo cansa rápido. Cole o Elixir aqui — um literal %Order{} sozinho, um defmodule com um defstruct, ou um arquivo inteiro com vários módulos — e você recebe XML bem formado numa passada só. A mesma forma que o XmlBuilder construiria, sem a burocracia.
O conversor conhece a semântica do Elixir. Átomos perdem os dois-pontos da frente — :is_paid como chave de map vira o nome do elemento is_paid, e true / false ficam como texto. Decimal.new("249.99") perde o wrapper e vira 249.99. DateTime, NaiveDateTime e Date saem como strings ISO-8601. Structs aninhados (um %Order{} com um campo shipping_address: %Address{}) se expandem no lugar, e valores nil viram elementos vazios em vez de serem descartados. Keyword lists como [sku: "SKU-101", qty: 2] são tratadas igual ao map equivalente.
Listas viram elementos contêineres com um filho por item, nomeados pelo tipo do struct: um campo items: [%OrderItem{}, %OrderItem{}] vira <items><OrderItem/><OrderItem/></items>. Isso bate com o jeito que o SweetXml lê XML de volta para Elixir e com o que a biblioteca xmerl por baixo espera. Tuplas ganham um wrapper <tuple> com filhos posicionais. Se você colar vários blocos defmodule, cada defstruct aparece na saída. Cole do jeito que está no seu arquivo .ex ou .exs — sem precisar limpar nada.
Como usar
Três passos. Funciona igual se você colar um struct só ou um arquivo de contexto Phoenix inteiro.
Cole seu Elixir (ou experimente o exemplo)
Jogue seu Elixir no editor da esquerda como está. Um defstruct, um literal %Struct{}, um map simples, uma keyword list ou structs aninhados — tudo vale. Clique em Carregar exemplo para ver um caso realista de Order / OrderItem / Address.
Não precisa tirar @moduledoc, remover anotações @derive ou limpar pipes e comentários. Cole o código Elixir do jeito que aparece no seu editor.
Clique em Converter
Aperte o botão verde Converter. A ferramenta lê o Elixir, mantém todos os campos, preserva structs aninhados e monta o XML numa passada só. Aparece um indicador breve de carregamento enquanto processa.
Copie o XML
O painel da direita se enche de XML indentado e bem formado. Copie direto para o corpo de uma requisição SOAP, uma chamada XML-RPC, uma fixture de teste ou o arquivo de seed da sua suíte de integração.
Quando realmente dá uma mão
Apps Phoenix falando com serviços SOAP
Seu contexto Phoenix te entrega um <code>%Order{}</code> bonitinho. O fornecedor lá embaixo só fala SOAP. Cole o struct, pegue o corpo do envelope XML, enfie na requisição — sem precisar montar árvores <code>XmlBuilder</code> à mão.
Integrações XML-RPC
Plugins antigos de WordPress, CMS legados, feeds financeiros — todos ainda falam XML-RPC. Transforme seu struct Elixir na forma <code><param><value><struct></code> que a spec espera, pronta para jogar no <code>HTTPoison</code>.
Integrações corporativas legadas
Arquivos bancários, feeds EDI, payloads de saúde estilo HL7. Se um parceiro insiste em XML, cole o modelo Elixir que você já tem e pegue um template XML equivalente — mais rápido do que brigar com <code>xmerl</code> do zero.
Fixtures para round-trip com SweetXml
Escrevendo um teste que lê XML com SweetXml e compara com um struct? Cole o struct, pegue o XML, salve como fixture. O round-trip fica consistente.
Perguntas frequentes
Posso colar vários blocos defmodule / defstruct de uma vez?
Pode. Cole um arquivo inteiro. Cada defstruct sai com os campos intactos, e referências a structs aninhados são expandidas. Se você incluir um literal %Struct{} no final com valores reais, a saída usa esses valores — senão ela emite a forma com elementos vazios.
Como os átomos são tratados?
Átomos usados como chaves de map/struct viram nomes de elemento (os dois-pontos da frente somem — :is_paid vira is_paid). Valores de átomo que são booleanos (true, false, nil) viram o texto correspondente. Outros átomos saem como texto sem os dois-pontos (:pending vira pending). Se você precisar da sintaxe original de átomo, pós-processe com String.to_atom/1 depois do parse.
E sobre Decimal, DateTime, Date, NaiveDateTime?
Decimal.new("249.99") perde o wrapper e vira 249.99. DateTime, NaiveDateTime e Date saem como strings ISO-8601. Time vira HH:MM:SS. Valores nil viram elementos vazios em vez de serem descartados — assim a forma fica consistente para round-trips com SweetXml.
Como listas, tuplas e keyword lists são traduzidas?
Listas de structs viram elementos contêineres com um filho por item, nomeado pelo struct: items: [%OrderItem{}, ...] vira <items><OrderItem/><OrderItem/></items>. Listas de escalares viram filhos <item> dentro do contêiner. Tuplas ganham um wrapper <tuple> com filhos posicionais <_0/>, <_1/>. Keyword lists são tratadas como maps — cada chave vira um elemento filho.
E se meu struct usa @derive para Jason / Poison?
A anotação @derive é uma dica de compilação para bibliotecas JSON e não afeta a saída XML. Todos os campos do struct são emitidos por padrão. Se você quer omitir um campo, tire ele da lista defstruct antes de colar, ou envolva o valor em algo que o conversor reconheça como "skip".
Meu código é armazenado?
Seu código é enviado ao backend para conversão e não é persistido — a gente não loga o payload. Como sempre em ferramentas online, se o código for realmente sensível, dê uma olhada antes de colar.
Outras ferramentas que podem ajudar
Elixir para XML é uma peça do quebra-cabeça. Essas ferramentas combinam bem com ela: