Trabalho com XML em Go (Golang): guia detalhado do pacote encoding/xml
No desenvolvimento moderno com Go (Golang), a tarefa de processar dados XML é bastante comum — desde a integração com sistemas legados até a troca de dados em serviços SOAP. A biblioteca padrão do Go fornece um pacote poderoso e flexível encoding/xml, que permite analisar, criar e transformar documentos XML de forma eficiente. Neste artigo, abordaremos detalhadamente todos os principais recursos para trabalhar com XML em Go.
Principais recursos do pacote encoding/xml
O pacote encoding/xml implementa uma interface simples para serialização (marshalling) de estruturas Go em XML e desserialização (unmarshalling) de XML de volta para estruturas. Ele suporta:
- Conversão de estruturas Go em documentos XML e vice-versa
- Trabalho com atributos, elementos aninhados e namespaces
- Parsing em streaming de grandes arquivos XML via
xml.Decoder - Regras de serialização personalizáveis usando tags de struct
Instalação e importação do pacote
O pacote encoding/xml faz parte da biblioteca padrão do Go, portanto, não é necessária instalação adicional. Para usá-lo, basta importá-lo:
import ( "encoding/xml" "fmt" "os")Marshalling: estrutura Go → XML
Para converter uma estrutura Go em XML, usa-se a função xml.Marshal() ou xml.MarshalIndent() para saída formatada. Veja um exemplo:
type Person struct { XMLName xml.Name `xml:"person"` ID int `xml:"id,attr"` FirstName string `xml:"name>first"` LastName string `xml:"name>last"` Age int `xml:"age"`}
func main() { p := Person{ ID: 123, FirstName: "João", LastName: "Silva", Age: 30, }
output, err := xml.MarshalIndent(p, "", " ") if err != nil { fmt.Printf("Erro de marshalling: %v", err) return }
fmt.Println(string(output))}Resultado da execução:
<person id="123"> <name> <first>João</first> <last>Silva</last> </name> <age>30</age></person>Unmarshalling: XML → estrutura Go
O processo inverso — conversão de dados XML em estrutura Go — é feito com xml.Unmarshal():
func unmarshalExample() { xmlData := `<person id="456"> <name> <first>Maria</first> <last>Santos</last> </name> <age>25</age></person>`
var p Person err := xml.Unmarshal([]byte(xmlData), &p) if err != nil { fmt.Printf("Erro de unmarshalling: %v", err) return }
fmt.Printf("ID: %d, Nome: %s %s, Idade: %d", p.ID, p.FirstName, p.LastName, p.Age) // Saída: ID: 456, Nome: Maria Santos, Idade: 25}Trabalho com atributos e elementos aninhados
O pacote encoding/xml usa tags de struct para controlar o mapeamento. As principais diretivas de tags:
xml:"nome"— nome do elementoxml:"nome,attr"— atributo do elementoxml:"pai>filho"— elemento aninhadoxml:",chardata"— conteúdo textualxml:",innerxml"— XML bruto dentro do elementoxml:",comment"— comentário XMLxml:"-"— ignorar campo
Parsing em streaming de grandes arquivos XML
Para processar documentos XML grandes (por exemplo, arquivos de gigabytes), usa-se o parser em streaming xml.Decoder. Isso permite não carregar