如何在Go中的元素中添加XML属性?

时间:2017-06-26 19:37:42

标签: xml go struct marshalling

我在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标签以将属性放在适当的元素中?

1 个答案:

答案 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上试试这个。