我在Go和Encoder example code中使用encoding / xml包。
虽然我能够生成可用的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
如何格式化struct标签以将属性放在适当的元素中?
答案 0 :(得分: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上试试这个。