Leer un archivo XML en Golang

Te mostraremos como leer un archivo XML en Golang, con un sencillo ejemplo de XML con nodos Usuario y datos básicos como nombre, usuario, password y correo. Además de estos datos tenemos un atributo «tipo» que nos indica que clase de usuario estamos almacenando. El archivo XML que leeremos es como sigue:

» Ver más ejemplos

<usuarios>
    <usuario tipo="admin">
        <nombre>Juan</nombre>
        <username>juan</username>
        <password>123321</password>
        <correo>juan1@prueba.com</correo>
    </usuario>
    <usuario tipo="consulta">
        <nombre>Pedro</nombre>
        <username>pedro</username>
        <password>111</password>
        <correo>pedro@prueba.com</correo>
    </usuario>
</usuarios>

El código para leer este archivo XML específico en Golang es el siguiente:

package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
)

//decodigo.com

type Usuarios struct {
	Usuarios   []Usuario   `xml:"usuario"`
}
 
type Usuario struct {
	Tipo    string `xml:"tipo,attr"`
	Nombre    string `xml:"nombre"`
	Username    string `xml:"username"`
	Password    string `xml:"password"`
	Correo    string `xml:"correo"`
}
 
func main() {
	datos, _ := ioutil.ReadFile("xml_ejemplo.xml")
 
	usuarios := &Usuarios{}
 
	_ = xml.Unmarshal([]byte(datos), &usuarios)
 
	fmt.Println("usuarios encontrados: ", len(usuarios.Usuarios))
	for i:= 0; i < len(usuarios.Usuarios); i++  {
		fmt.Println("tipo: ", usuarios.Usuarios[i].Tipo)
		fmt.Println("nombre: ", usuarios.Usuarios[i].Nombre)
		fmt.Println("username: ", usuarios.Usuarios[i].Username)
		fmt.Println("password: ", usuarios.Usuarios[i].Password)
		fmt.Println("correo: ", usuarios.Usuarios[i].Correo)
	}
}

Te explicamos brevemente lo que hacemos. Primero creamos dos structs con la misma estructura de nodos que nuestro XML. El nodo raíz es el de «usuarios» y lo mapearemos con el struct «Usuarios» como sigue:

type Usuarios struct {
	Usuarios   []Usuario   `xml:"usuario"`
}

Sólo estamos almacenando un arreglo de structs «Usuario«, con el nombre en singular y cuya definición es la siguiente:

type Usuario struct {
	Tipo    string `xml:"tipo,attr"`
	Nombre    string `xml:"nombre"`
	Username    string `xml:"username"`
	Password    string `xml:"password"`
	Correo    string `xml:"correo"`
}

Algo importante que debes notar es que, los atributos de un nodo XML se definen de forma explícita como atributos con la palabra «attr» como sigue:

Tipo    string `xml:"tipo,attr" 

Los nodos hijos dentro de nuestro nodo de interés como usuario, sólo llevarán el complemento ‘xml:nombre‘ con el nombre del nodo que necesitamos mapear.

Para leer el XML en nuestro código, lo primero que hacemos es abrir el archivo de texto con ReadFile y posteriormente creamos un instancia de Usuarios en la que mapearemos nuestro arreglo de datos a partir del XML con la llamada a Unmarshal como te mostramos a continuación:

	datos, _ := ioutil.ReadFile("xml_ejemplo.xml")
 
	usuarios := &Usuarios{}
 
	_ = xml.Unmarshal([]byte(datos), &usuarios)

Finalmente mostramos en consola el contenido de nuestro arreglo de Usuarios:

	fmt.Println("usuarios encontrados: ", len(usuarios.Usuarios))
	for i:= 0; i < len(usuarios.Usuarios); i++  {
		fmt.Println("tipo: ", usuarios.Usuarios[i].Tipo)
		fmt.Println("nombre: ", usuarios.Usuarios[i].Nombre)
		fmt.Println("username: ", usuarios.Usuarios[i].Username)
		fmt.Println("password: ", usuarios.Usuarios[i].Password)
		fmt.Println("correo: ", usuarios.Usuarios[i].Correo)
	}

Al ejecutar el ejemplo obtendrás el siguiente resultado:

Leer un archivo XML en Golang

Como te habrás dado cuenta, con esta forma de leer un XML es necesario saber con anterioridad la estructura exacta que esperas tener en el XML. Si declaras variables en tu struct que no están en el XML estas simplemente no se leerán y quedarán vacías. Leer un archivo XML en Golang no es complicado, pero debes cuidar que la estructura de tu XML y tus structs sean consistentes.

Ver más: https://golang.org/src/encoding/xml/example_test.go