Maison  >  Article  >  développement back-end  >  Comment désorganiser XML avec des attributs et des valeurs dans Go ?

Comment désorganiser XML avec des attributs et des valeurs dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-24 00:37:02277parcourir

How to Unmarshal XML with Attributes and Values in Go?

Désagrégation des éléments XML avec des attributs et des valeurs dans Go

Les éléments XML contiennent souvent à la fois des attributs et des valeurs. Pour réussir à désassembler de tels éléments dans des structures Golang, il est essentiel de comprendre le rôle des annotations XMLName et ",chardata".

Définir la structure sans XMLName

Considérez les XML fourni :

<code class="xml"><thing prop="1">
  1.23
</thing>
<thing prop="2">
  4.56
</thing></code>

La structure correspondante sans champ XMLName pourrait être :

<code class="go">type ThingElem struct {
    Prop  int   `xml:"prop,attr"`
    Value float64 `xml:",chardata"`
}</code>

Prop est annotée avec xml:"prop,attr" pour indiquer qu'il s'agit d'un attribut du élément de chose. La valeur est annotée avec xml:",chardata" pour spécifier qu'elle doit contenir le contenu de l'élément sous forme de chaîne.

Comprendre XMLName

XMLName peut être utilisé pour définir explicitement le nom de la balise XML d'une structure. Dans notre cas, le nom de la balise XML est déduit puisqu'il correspond au nom de la structure (ThingElem). Ainsi, XMLName n'est pas requis dans ce scénario.

Utilisation d'une structure wrapper

Si la structure XML est plus complexe ou peut être ambiguë, vous pouvez utiliser une structure wrapper pour fournir un contexte supplémentaire. Par exemple, si le XML avait plusieurs éléments thing dans un élément racine :

<code class="xml"><root>
  <thing prop="1">
    1.23
  </thing>
  <thing prop="2">
    4.56
  </thing>
</root></code>

Vous auriez besoin d'une structure wrapper :

<code class="go">type ThingWrapper struct {
    T ThingElem `xml:"thing"`
}</code>

Ici, T est la structure intégrée qui représente le élément thing.

Considérations de démarshaling

Pour les données XML fournies, vous devez tenir compte des espaces dans les valeurs de l'élément. Étant donné que XML ne préserve pas les espaces par défaut, les valeurs doivent être tronquées ou l'annotation xml:",innerxml" peut être utilisée.

La structure résultante peut être désorganisée comme suit :

<code class="go">package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

type Root struct {
    Things []Thing `xml:"thing"`
}

type Thing struct {
    Prop  int     `xml:"prop,attr"`
    Value float64 `xml:",chardata"`
}

func main() {
    data := `
<root>
<thing prop="1"> 1.23 </thing>
<thing prop="2"> 4.56 </thing>
</root>
`
    thing := &Root{}
    err := xml.Unmarshal([]byte(strings.TrimSpace(data)), thing)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(thing)
}</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