Maison > développement back-end > Golang > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-24 00:37:02
original
291 Les gens l'ont consulté

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>
Copier après la connexion

La structure correspondante sans champ XMLName pourrait être :

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

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>
Copier après la connexion

Vous auriez besoin d'une structure wrapper :

<code class="go">type ThingWrapper struct {
    T ThingElem `xml:"thing"`
}</code>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!