2017-06-26 1 views
2

J'utilise le package d'encodage/xml dans Go et le Encoder example code.Comment ajouter un attribut XML à un élément dans Go?

Bien que je puisse produire du XML exploitable, je ne peux pas ajouter tous les attributs dont j'ai besoin. À titre d'exemple, utilisons le concept de rapport de température. Ce que je dois quelque chose comme ceci:

<environment> 
    <temperature type="float" units="c">-11.3</temperature> 
</environment> 

Mon struct ressemble à ceci:

type climate struct { 
    XMLName  xml.Name `xml:"environment"` 
    Temperature string  `xml:"temperature"` 
    Type  string  `xml:"type,attr"` 
    Units  string  `xml:"unit,attr"` 
} 

Ce que je finis avec ressemble à ceci:

<environment type="float" unit="c"> 
    <temperature>-11.3</temperature> 
</environment> 

My example code in the Go Playground

Comment puis-je formater les balises struct pour mettre les attributs dans l'élément approprié?

Répondre

2

Votre XML souhaité a 2 éléments: <environment> et <temperature>, donc vous devriez avoir 2 types (structs) pour les modéliser. Et vous pouvez utiliser l'étiquette ",chardata" pour indiquer à l'encodeur d'écrire la valeur du champ en tant que donnée de caractère et non en tant qu'élément XML.

type environment struct { 
    Temperature temperature `xml:"temperature"` 
} 

type temperature struct { 
    Temperature string `xml:",chardata"` 
    Type  string `xml:"type,attr"` 
    Units  string `xml:"unit,attr"` 
} 

Test il:

x := &environment{ 
    Temperature: temperature{Temperature: "-11.3", Type: "float", Units: "c"}, 
} 

enc := xml.NewEncoder(os.Stdout) 
enc.Indent("", " ") 
if err := enc.Encode(x); err != nil { 
    fmt.Printf("error: %v\n", err) 
} 

Elle produit la sortie désirée (essayez le Go Playground):

<environment> 
    <temperature type="float" unit="c">-11.3</temperature> 
</environment> 

Notez que vous obtenez le même résultat si vous utilisez la balise ",innerxml" qui indique à l'encodeur d'écrire la valeur verbatim, non soumise à la procédure habituelle de marshaling:

type temperature struct { 
    Temperature string `xml:",innerxml"` 
    Type  string `xml:"type,attr"` 
    Units  string `xml:"unit,attr"` 
} 

La sortie est la même. Essayez celui-ci sur le Go Playground.