Trabajo con XML en Go (Golang): guía detallada del paquete encoding/xml
En el desarrollo moderno con Go (Golang), la tarea de procesar datos XML es bastante común, desde la integración con sistemas heredados hasta el intercambio de datos en servicios SOAP. La biblioteca estándar de Go proporciona un paquete potente y flexible encoding/xml que permite analizar, crear y transformar documentos XML de manera eficiente. En este artículo, analizaremos en detalle todas las capacidades clave para trabajar con XML en Go.
Capacidades principales del paquete encoding/xml
El paquete encoding/xml implementa una interfaz simple para la serialización (marshalling) de estructuras de Go a XML y la deserialización (unmarshalling) de XML de vuelta a estructuras. Soporta:
- Conversión de estructuras de Go a documentos XML y viceversa
- Trabajo con atributos, elementos anidados y espacios de nombres
- Análisis en streaming de archivos XML grandes mediante
xml.Decoder - Reglas de serialización personalizables mediante etiquetas de estructura
Instalación e importación del paquete
El paquete encoding/xml está incluido en la biblioteca estándar de Go, por lo que no se requiere instalación adicional. Para usarlo, basta con importarlo:
import ( "encoding/xml" "fmt" "os")Marshalling: estructura Go → XML
Para convertir una estructura de Go a XML se utiliza la función xml.Marshal() o xml.MarshalIndent() para una salida formateada. Veamos un ejemplo:
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: "Iván", LastName: "Petrov", Age: 30, }
output, err := xml.MarshalIndent(p, "", " ") if err != nil { fmt.Printf("Error de marshalling: %v", err) return }
fmt.Println(string(output))}Resultado de la ejecución:
<person id="123"> <name> <first>Iván</first> <last>Petrov</last> </name> <age>30</age></person>Unmarshalling: XML → estructura Go
El proceso inverso, convertir datos XML en una estructura de Go, se realiza con xml.Unmarshal():
func unmarshalExample() { xmlData := `<person id="456"> <name> <first>María</first> <last>Sidorova</last> </name> <age>25</age></person>`
var p Person err := xml.Unmarshal([]byte(xmlData), &p) if err != nil { fmt.Printf("Error de unmarshalling: %v", err) return }
fmt.Printf("ID: %d, Nombre: %s %s, Edad: %d", p.ID, p.FirstName, p.LastName, p.Age) // Salida: ID: 456, Nombre: María Sidorova, Edad: 25}Trabajo con atributos y elementos anidados
El paquete encoding/xml utiliza etiquetas de estructura para controlar el mapeo. Las directivas principales de las etiquetas:
xml:"name"— nombre del elementoxml:"name,attr"— atributo del elementoxml:"parent>child"— elemento anidadoxml:",chardata"— contenido de textoxml:",innerxml"— XML sin procesar dentro del elementoxml:",comment"— comentario XMLxml:"-"— ignorar el campo
Análisis en streaming de archivos XML grandes
Para procesar documentos XML grandes (por ejemplo, archivos de gigabytes), se utiliza el analizador en streaming xml.Decoder. Esto permite no cargar