2017-06-26 12 views
2

私は、GoとEncoder example codeでencoding/xmlパッケージを使用しています。Goの要素にXML属性を追加する方法は?

私は実行可能なXMLを作成できますが、必要なすべての属性を追加できません。

例として、温度レポートの概念を使用しましょう。私に必要なのは、このようなものです:

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

私の構造体は次のようになります。

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

My example code in the Go Playground

方法:私はこのようなルックスで終わる何

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

適切な要素に属性を入れるためにstructタグをフォーマットできますか?

答えて

2

希望するXMLには、<environment><temperature>の2つの要素があります。したがって、モデル化するには2つの型(構造体)が必要です。そして、",chardata"というタグを使用して、フィールド値を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"` 
} 

テストそれ:あなたが",innerxml"タグを使用する場合は、同じ結果を得る

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

注:

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

それは、所望の出力を(Go Playground上でそれを試してみてください)を生成これは通常のマーシャリング手順の対象ではなく、値をそのまま書くようにエンコーダに指示します。

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

出力は同じです。 Go Playgroundで試してみてください。

関連する問題