Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erfasst man alle Elemente in einem XML-Array beim Unmarshaling in Golang?

Wie erfasst man alle Elemente in einem XML-Array beim Unmarshaling in Golang?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-24 06:16:02903Durchsuche

How to Capture All Elements in an XML Array During Unmarshaling in Golang?

Unmarshaling von XML-Arrays, um alle Elemente in Golang zu erfassen

Problem:

Beim Unmarshaling eines XML-Arrays in eine Struktur, Es wird nur das erste Element des Arrays abgerufen.

Originalcode:

<code class="go">type HostSystemIdentificationInfo []struct {
    IdentiferValue string `xml:"identifierValue"`
    IdentiferType  struct {
        Label   string `xml:"label"`
        Summary string `xml:"summary"`
        Key     string `xml:"key"`
    } `xml:"identifierType"`
}

func unmarshal(xmlBytes []byte) (HostSystemIdentificationInfo, error) {
    var t HostSystemIdentificationInfo
    err := xml.Unmarshal(xmlBytes, &t)
    return t, err
}</code>

Problem:

Das Obige Der Code versucht, eine XML-Zeichenfolge in ein Segment der Strukturen HostSystemIdentificationInfo zu entmarshalieren, erfasst jedoch nur das erste Element des Arrays.

Lösung:

So erfassen Sie alle Elemente von Um das XML-Array zu verwenden, müssen Sie einen XML-Decoder verwenden und dessen Decode-Methode mehrmals aufrufen. Der folgende Code zeigt, wie dies erreicht wird:

<code class="go">// ... (same struct definitions as in the original code)

func unmarshal(xmlBytes []byte) (HostSystemIdentificationInfo, error) {
    dec := xml.NewDecoder(bytes.NewReader(xmlBytes))
    var t HostSystemIdentificationInfo
    for {
        err := dec.Decode(&t)
        if err == io.EOF {
            break
        }
        if err != nil {
            return nil, err
        }
    }
    return t, nil
}</code>

Erklärung:

  • Die xml.NewDecoder-Funktion erstellt einen neuen XML-Decoder, der von einem io liest .Reader.
  • Die for-Schleife durchläuft die XML-Eingabe und dekodiert jedes Element in das t-Slice.
  • Die dec.Decode(&t)-Methode dekodiert das nächste XML-Element in die Variable t.
  • Die Schleife wird fortgesetzt, bis das Dateiende (EOF) erreicht ist, was anzeigt, dass alle Elemente verarbeitet wurden.

Verwendung:

<code class="go">xmlBytes = []byte(`
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>...</identifierValue>
  <identifierType>...</identifierType>
</HostSystemIdentificationInfo>
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>...</identifierValue>
  <identifierType>...</identifierType>
</HostSystemIdentificationInfo>
`)

t, err := unmarshal(xmlBytes)
if err != nil {
    log.Fatal(err)
}

fmt.Println(t) // All elements of the XML array will be printed</code>

Das obige ist der detaillierte Inhalt vonWie erfasst man alle Elemente in einem XML-Array beim Unmarshaling in Golang?. 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