Trabajo con XML en Go (Golang): biblioteca estándar encoding/xml

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 elemento
  • xml:"name,attr" — atributo del elemento
  • xml:"parent>child" — elemento anidado
  • xml:",chardata" — contenido de texto
  • xml:",innerxml" — XML sin procesar dentro del elemento
  • xml:",comment" — comentario XML
  • xml:"-" — 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

Recommendations