Heim >Backend-Entwicklung >Golang >Wie vermeide ich das Unmarshaling nur des ersten Elements eines XML-Arrays in Go?

Wie vermeide ich das Unmarshaling nur des ersten Elements eines XML-Arrays in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-10-24 06:29:02602Durchsuche

How to Avoid Unmarshaling Only the First Element of an XML Array in Go?

Unmarshal XML Array in Go: Nur das erste Element abrufen

XML, ein in Unternehmensumgebungen weit verbreitetes Datenformat, wird häufig in komplexen Darstellungen dargestellt , verschachtelte Strukturen. Go, eine vielseitige Programmiersprache, bietet robuste XML-Unmarshaling-Funktionen. Es kann jedoch von entscheidender Bedeutung sein, die Nuancen des Unmarshaling von XML-Arrays zu verstehen.

In einem bestimmten Szenario ist ein Entwickler beim Unmarshaling eines XML-Arrays auf ein Problem gestoßen. Der Code hat das erste Element erfolgreich entmarshallt, aber das gesamte Array konnte nicht abgerufen werden.

Das Problem:

type HostSystemIdentificationInfo []struct {
    IdentiferValue string `xml:"identifierValue"`
    IdentiferType  struct {
        Label   string `xml:"label"`
        Summary string `xml:"summary"`
        Key     string `xml:"key"`
    } `xml:"identifierType"`
}

func main() {
    var t HostSystemIdentificationInfo
    err := xml.Unmarshal([]byte(vv), &t)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(t)
}

const vv = `
  <HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
    <identifierValue>unknown</identifierValue>
    <identifierType>
      <label>Asset Tag</label>
      <summary>Asset tag of the system</summary>
      <key>AssetTag</key>
    </identifierType>
  </HostSystemIdentificationInfo>
`

Die erwartete Ausgabe:

[{ unknown {Asset Tag Asset tag of the system AssetTag}}]

Die tatsächliche Ausgabe:

[{ unknown {Asset Tag Asset tag of the system AssetTag}}]

Lösung:

Das Problem entsteht aufgrund eines Missverständnisses über die XML-Unmarshaling-Prozess. Beim Unmarshaling eines XML-Arrays können Sie nicht einfach die Zielstruktur als Zeiger zum Empfang der Daten angeben. Stattdessen müssen Sie einen xml.Decoder erstellen und seine Decode-Methode wiederholt aufrufen.

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
    "io"
    "log"
)

type HostSystemIdentificationInfo struct {
    IdentiferValue string `xml:"identifierValue"`
    IdentiferType  struct {
        Label   string `xml:"label"`
        Summary string `xml:"summary"`
        Key     string `xml:"key"`
    } `xml:"identifierType"`
}

func main() {
    d := xml.NewDecoder(bytes.NewBufferString(vv))
    for {
        var t HostSystemIdentificationInfo
        err := d.Decode(&t)
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(t)
    }
}

const vv = `
  <HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
    <identifierValue>unknown</identifierValue>
    <identifierType>
      <label>Asset Tag</label>
      <summary>Asset tag of the system</summary>
      <key>AssetTag</key>
    </identifierType>
  </HostSystemIdentificationInfo>
`

Durch die Verwendung des xml.Decoder können Sie jedes Element im XML-Array korrekt durchlaufen und einzeln entmarshalieren.

Durch die Befolgung dieser Schritte können Entwickler XML-Arrays in Go effektiv entmarshalieren und so komplexe Datenstrukturen effizient analysieren.

Das obige ist der detaillierte Inhalt vonWie vermeide ich das Unmarshaling nur des ersten Elements eines XML-Arrays in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn