Maison  >  Article  >  développement back-end  >  Comment capturer tous les éléments d'un tableau XML lors du démarshalage dans Golang ?

Comment capturer tous les éléments d'un tableau XML lors du démarshalage dans Golang ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 06:16:02900parcourir

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

Désagrégation des tableaux XML pour capturer tous les éléments dans Golang

Problème :

Lors de la désorganisation d'un tableau XML dans une structure, seul le premier élément du tableau est récupéré.

Code original :

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

Problème :

Ce qui précède Le code tente de décomposer une chaîne XML en une tranche de structures HostSystemIdentificationInfo, mais il ne capture que le premier élément du tableau.

Solution :

Pour capturer tous les éléments de le tableau XML, vous devez utiliser un décodeur XML et appeler sa méthode Decode plusieurs fois. Le code ci-dessous montre comment y parvenir :

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

Explication :

  • La fonction xml.NewDecoder crée un nouveau décodeur XML qui lit à partir d'un io .Reader.
  • La boucle for parcourt l'entrée XML, décodant chaque élément dans la tranche t.
  • La méthode dec.Decode(&t) décode l'élément XML suivant dans la variable t.
  • La boucle continue jusqu'à ce que la fin du fichier (EOF) soit atteinte, indiquant que tous les éléments ont été traités.

Utilisation :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn