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

7

我正在使用Go语言中的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>

在 Go Playground 中的我的示例代码

我该如何格式化结构标记,以将属性放入正确的元素中?

1个回答

10
您想要的 XML 包含 2 个元素: <environment><temperature>,因此您应该有 2 种类型(structs)来对其进行建模。您可以使用标记",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上尝试一下这个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接