Cole Go à esquerda e clique em "Converter" — transformamos em XMLCole código Go

O que esta ferramenta faz

Se você já precisou montar um payload XML que casa com um struct de Go — para um cliente SOAP, um feed RSS, um webhook de SaaS legado ou um sitemap de fornecedor — já sabe o trabalho que dá. Dá para chamar xml.Marshal você mesmo, mas aí precisa montar o main.go, compilar e conferir a saída no olho. Cola o Go aqui e recebe XML bem formado num passo só. Um struct, um arquivo com vários, ou um literal que você copiou do Go by Example — mesma coisa: um documento XML completo com todos os campos preservados.

Reflete o que o pacote encoding/xml produziria de fato. Uma tag como xml:"OrderId,attr" transforma o campo em atributo do pai; xml:"-" descarta; xml:",omitempty" deixa o elemento de fora quando o valor é o valor zero; xml:"Items>OrderItem" envolve o slice num contêiner <Items> com um <OrderItem> por elemento; xml:",chardata" coloca o valor como conteúdo de texto. XMLName xml.Name renomeia o próprio elemento. Campos ponteiro com valor nil são emitidos como elementos vazios apenas quando ,omitempty está ausente — exatamente como a lib padrão se comporta.

Escalares são tratados como Go trataria: float64 sai sem notação científica quando cabe, time.Time usa RFC 3339, booleanos são true/false minúsculos, e int/uint saem sem padding. Structs aninhados viram elementos aninhados. Slices de structs viram elementos repetidos no mesmo nível. Maps não são suportados nativamente pelo encoding/xml — são achatados em filhos repetidos <Entry><Key/><Value/></Entry> para que o formato siga fazendo sentido. Está escrevendo Go idiomático? O guia de estilo em Effective Go é uma boa referência para os padrões que esta ferramenta espera.

Como usar

Três passos. Funciona igual se você cola um struct ou um arquivo de pacote inteiro.

1

Cole seu Go (ou teste o exemplo)

Jogue seu Go no editor da esquerda do jeito que está. Uma única declaração de struct, um arquivo inteiro com imports e vários tipos, ou um composite literal tipo order := Order{...} — tudo funciona. Clique em Carregar exemplo para ver um caso realista primeiro.

Não precisa tirar a linha package, remover imports nem arrumar o arquivo. Cole do jeito que sai do gofmt. Tags de struct com crase são esperadas.

2

Aperte Converter

Clique no botão verde Converter. A ferramenta lê o Go, respeita cada tag xml do struct e monta o XML numa passada só. Um indicador curto de carregamento aparece enquanto roda.

3

Copie o XML

O painel da direita se preenche com XML indentado e bem formado que qualquer parser XML padrão vai aceitar. Cole no seu envelope SOAP, arquivo de config, fixture de teste ou documentação de API.

Quando isso realmente ajuda

Montar fixtures de cliente SOAP

Você está falando com uma API SOAP corporativa legada a partir de um serviço Go. Cole o struct de request e pegue o body XML pronto para SoapUI, Postman ou a suíte de testes.

Feeds RSS e Atom

Um struct de feed com campos Channel, Item e enclosure vira um template RSS ou Atom funcional — útil para conferir o layout das tags antes de ligar o handler.

Arquivos de config de fornecedor

Alguns SaaS ainda consomem config em XML (pense em sitemaps, pipelines de logging, consoles de ops legados). Cole o struct de config em Go e jogue o XML direto.

Manter a documentação honesta

Gere exemplos XML para um README ou referência de API a partir dos tipos Go de verdade, para que os exemplos nunca saiam do ritmo com o código que vai para main.

Perguntas comuns

Posso colar vários structs de uma vez?

Pode — cole o arquivo inteiro. A raiz é detectada a partir do composite literal (ex.: order := Order{...}) quando está presente, ou do primeiro struct que referencia os outros. Structs aninhados e irmãos saem como elementos aninhados ou fragmentos separados, nada é descartado silenciosamente.

Respeita tags de struct como xml:"x,attr", xml:"-" e xml:",omitempty"?

Sim — e todas as variantes comuns. xml:"name" renomeia o elemento, xml:"name,attr" emite como atributo no pai, xml:"-" descarta o campo por completo, xml:",omitempty" pula campos com valor zero, xml:"a>b" envolve o slice num contêiner <a> com um <b> por elemento, xml:",chardata" coloca o valor como texto do elemento, e xml:",innerxml" passa como XML bruto. Isso bate com o comportamento documentado na referência de encoding/xml Marshal.

E o campo especial XMLName?

Um campo do tipo xml.Name chamado XMLName renomeia o elemento raiz. XMLName xml.Name `xml:"Order"` produz <Order>...</Order>. Sem ele, a ferramenta usa o nome do tipo do struct como raiz — o mesmo default do xml.Marshal.

Como lida com ponteiros, slices e maps?

Campos ponteiro com nil emitem um elemento vazio, a menos que haja ,omitempty, quando então são pulados. Slices de structs viram elementos irmãos repetidos (ou envolvidos num contêiner quando a tag usa o formato a>b). Maps não são nativamente tratados pelo encoding/xml, então a ferramenta emite como uma série de filhos <Entry><Key/><Value/></Entry> — bom o suficiente para a maioria dos casos e explícito a ponto de você editar se quiser outra forma.

Meu código fica guardado?

Seu código é enviado ao backend para a conversão e não é persistido — não logamos o payload. Aviso padrão de ferramentas online: se o código for realmente sensível, dá uma olhada antes de colar.

E se o struct usa tipos que encoding/xml não suporta — channels, funcs, complex?

Eles saem como elementos vazios em vez de falhar a conversão inteira, na linha do que xml.Marshal faria em runtime (ele retorna erro; a ferramenta segue para você pelo menos ter o resto). Se o próprio Go tem erro de sintaxe, corrija os óbvios primeiro — o parser é tolerante, mas não é um gc completo.

Outras ferramentas que podem ajudar

Go para XML é só uma peça do quebra-cabeça. Essas ferramentas combinam bem: