Go:
Lavorare con XML
Come fare:
Analizzare XML in Go
Per analizzare XML in Go, si utilizza il pacchetto encoding/xml
. Questo pacchetto fornisce gli strumenti necessari per destrutturare (analizzare) XML in struct di Go. Considera, ad esempio, i seguenti dati XML che rappresentano un libro:
<book id="123">
<title>Learning Go</title>
<author>John Doe</author>
<pages>359</pages>
</book>
Per analizzare ciò, definisci una struct che riflette la struttura 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("Libro: %+v\n", book)
}
Output:
Libro: {XMLName:{Space: Local:book} ID:123 Titolo:Learning Go Autore:John Doe Pagine:359}
Generare XML in Go
Per generare un documento XML a partire da strutture dati Go, si utilizza nuovamente il pacchetto encoding/xml
. Questa volta si trasformano le struct Go in XML. Dato il precedente struct Book
:
package main
import (
"encoding/xml"
"fmt"
"os"
)
func main() {
book := &Book{
ID: "123",
Titolo: "Learning Go",
Autore: "John Doe",
Pagine: 359,
}
output, err := xml.MarshalIndent(book, "", " ")
if err != nil {
panic(err)
}
fmt.Println(xml.Header + string(output))
}
Output:
<?xml version="1.0" encoding="UTF-8"?>
<book id="123">
<title>Learning Go</title>
<author>John Doe</author>
<pages>359</pages>
</book>
Approfondimento
La verbosità e la complessità di XML hanno portato a JSON e altri formati a diventare più popolari per molte applicazioni. Tuttavia, la capacità di XML di rappresentare dati gerarchici complessi e il suo ampio utilizzo in sistemi legacy e domini specifici (ad es., servizi SOAP) ne assicurano la rilevanza.
Il pacchetto encoding/xml
in Go offre meccanismi potenti per lavorare con XML, ma vale la pena notare le sue limitazioni. Ad esempio, la gestione degli spazi dei nomi XML può essere laboriosa e potrebbe richiedere una comprensione più dettagliata delle specifiche XML rispetto a casi d’uso più semplici. Inoltre, mentre la tipizzazione statica di Go e le capacità di marshaling e unmarshaling del pacchetto encoding/xml
sono generalmente efficienti, gli sviluppatori potrebbero incontrare sfide con strutture profondamente annidate o quando si tratta di documenti XML che non si mappano ordinatamente sul sistema di tipi di Go.
Per la maggior parte delle applicazioni moderne, alternative come JSON sono più semplici ed efficienti. Tuttavia, quando si lavora in contesti che richiedono XML – a causa di sistemi legacy, standard specifici del settore o esigenze di rappresentazione dei dati complessi – la libreria standard di Go fornisce strumenti robusti per svolgere il lavoro. Come sempre, la scelta migliore del formato dei dati dipende dai requisiti specifici dell’applicazione e dall’ambiente.