Go:
Trabalhando com XML
Como fazer:
Fazendo Parsing de XML em Go
Para fazer parsing de XML em Go, você utiliza o pacote encoding/xml
. Esse pacote fornece as ferramentas necessárias para unmarshal (fazer o parsing) de XML para structs de Go. Por exemplo, considere os seguintes dados XML representando um livro:
<book id="123">
<title>Learning Go</title>
<author>John Doe</author>
<pages>359</pages>
</book>
Para fazer o parsing disso, defina uma struct que espelhe a estrutura XML:
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Book struct {
XMLName xml.Name `xml:"book"`
ID string `xml:"id,attr"`
Title string `xml:"title"`
Author string `xml:"author"`
Pages int `xml:"pages"`
}
func main() {
data := []byte(`
<book id="123">
<title>Learning Go</title>
<author>John Doe</author>
<pages>359</pages>
</book>
`)
var book Book
err := xml.Unmarshal(data, &book)
if err != nil {
panic(err)
}
fmt.Printf("Livro: %+v\n", book)
}
Saída:
Livro: {XMLName:{Space: Local:book} ID:123 Title:Learning Go Author:John Doe Pages:359}
Gerando XML em Go
Para gerar um documento XML a partir de estruturas de dados Go, você usa novamente o pacote encoding/xml
. Desta vez, você transforma structs de Go em XML. Dada a struct Book
anterior:
package main
import (
"encoding/xml"
"fmt"
"os"
)
func main() {
book := &Book{
ID: "123",
Title: "Learning Go",
Author: "John Doe",
Pages: 359,
}
output, err := xml.MarshalIndent(book, "", " ")
if err != nil {
panic(err)
}
fmt.Println(xml.Header + string(output))
}
Saída:
<?xml version="1.0" encoding="UTF-8"?>
<book id="123">
<title>Learning Go</title>
<author>John Doe</author>
<pages>359</pages>
</book>
Aprofundamento
A verbosidade e complexidade do XML levaram ao JSON e outros formatos se tornarem mais populares para muitas aplicações. No entanto, a habilidade do XML em representar dados hierárquicos complexos e seu uso disseminado em sistemas legados e domínios específicos (por exemplo, serviços SOAP) asseguram sua relevância.
O pacote encoding/xml
em Go fornece mecanismos poderosos para trabalhar com XML, mas vale destacar suas limitações. Por exemplo, lidar com namespaces XML pode ser complicado e pode exigir um entendimento mais detalhado da especificação XML do que para casos de uso mais simples. Além disso, enquanto a tipagem estática de Go e as capacidades de marshaling e unmarshaling do pacote encoding/xml
são geralmente eficientes, desenvolvedores podem encontrar desafios com estruturas profundamente aninhadas ou ao lidar com documentos XML que não se mapeiam de forma limpa para o sistema de tipos de Go.
Para a maioria das aplicações modernas, alternativas como JSON são mais simples e eficientes. No entanto, quando trabalhando em contextos que necessitam de XML — devido a sistemas legados, padrões industriais específicos ou necessidades complexas de representação de dados — a biblioteca padrão do Go fornece ferramentas robustas para realizar o trabalho. Como sempre, a melhor escolha de formato de dados depende dos requisitos específicos da aplicação e do ambiente.