Go:
Werken met XML

Hoe:

XML Parsen in Go

Om XML in Go te parsen, gebruik je het encoding/xml pakket. Dit pakket biedt de nodige hulpmiddelen om XML naar Go structs te unmarshalen (parsen). Beschouw bijvoorbeeld de volgende XML-gegevens die een boek voorstellen:

<book id="123">
    <title>Learning Go</title>
    <author>John Doe</author>
    <pages>359</pages>
</book>

Om dit te parsen, definieer je een struct die de XML-structuur weerspiegelt:

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("Boek: %+v\n", book)
}

Output:

Boek: {XMLName:{Space: Local:book} ID:123 Title:Learning Go Author:John Doe Pages:359}

XML Genereren in Go

Om een XML-document te genereren vanuit Go-gegevensstructuren, gebruik je opnieuw het encoding/xml pakket. Deze keer marshal je Go structs naar XML. Gegeven de voorgaande Book struct:

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))
}

Output:

<?xml version="1.0" encoding="UTF-8"?>
<book id="123">
    <title>Learning Go</title>
    <author>John Doe</author>
    <pages>359</pages>
</book>

Diepgaande Duik

De uitvoerigheid en complexiteit van XML hebben ertoe geleid dat JSON en andere formaten populairder zijn geworden voor veel toepassingen. Echter, het vermogen van XML om complexe hiërarchische gegevens te vertegenwoordigen en het wijdverbreide gebruik in legacy-systemen en specifieke domeinen (bijv. SOAP-services) garanderen de relevantie ervan.

Het encoding/xml pakket in Go biedt krachtige mechanismen om met XML te werken, maar het is de moeite waard om de beperkingen ervan op te merken. Bijvoorbeeld, het omgaan met XML-naamruimten kan lastig zijn en kan een meer gedetailleerd begrip van de XML-specificatie vereisen dan voor eenvoudigere gebruikscases. Daarnaast kunnen ontwikkelaars, hoewel de statische typen van Go en de marshal- en unmarshal-mogelijkheden van het encoding/xml pakket over het algemeen efficiënt zijn, uitdagingen tegenkomen met diep geneste structuren of bij het omgaan met XML-documenten die niet netjes op het type systeem van Go passen.

Voor de meeste moderne toepassingen zijn alternatieven zoals JSON eenvoudiger en efficiënter. Echter, wanneer je in contexten werkt die XML noodzakelijk maken - vanwege legacy-systemen, specifieke industriestandaarden of complexe gegevensrepresentatiebehoeften - biedt de standaardbibliotheek van Go robuuste hulpmiddelen om de klus te klaren. Zoals altijd, hangt de beste keuze van gegevensformaat af van de specifieke vereisten van de toepassing en de omgeving.