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!