2017-06-26 106 views
2

我在Go中使用編碼/ xml包和Encoder example code如何將XML屬性添加到Go中的元素?

雖然我能夠生成可行的XML,但我無法添加所需的所有屬性。

作爲一個例子,讓我們使用溫度報告的概念。我需要的是這樣的:

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

我的結構是這樣的:

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

我到底是什麼了這個樣子的:

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

My example code in the Go Playground

如何我可以格式化結構標籤以將屬性放入正確的元素中嗎?

回答

2

你想要的XML有2個元素:<environment><temperature>,所以你應該有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"` 
} 

測試它:

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

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

注意,你得到同樣的結果,如果你使用",innerxml"標籤它告訴編碼器逐字寫入數值,不受通常的編組程序限制:

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

輸出是一樣的。在Go Playground上試試這個。