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

Xev*_*ous 4 xml struct marshalling go

我在 Go 中使用 encoding/xml 包和Encoder 示例代码

虽然我能够生成可行的 XML,但我无法添加我需要的所有属性。

例如,让我们使用温度报告的概念。我需要的是这样的:

<environment>
  <temperature type="float" units="c">-11.3</temperature>
</environment>
Run Code Online (Sandbox Code Playgroud)

我的结构是这样的:

type climate struct {
    XMLName     xml.Name    `xml:"environment"`
    Temperature string      `xml:"temperature"`
    Type        string      `xml:"type,attr"`
    Units       string      `xml:"unit,attr"`
}
Run Code Online (Sandbox Code Playgroud)

我最终得到的是这样的:

<environment type="float" unit="c">
  <temperature>-11.3</temperature>
</environment>
Run Code Online (Sandbox Code Playgroud)

我在 Go Playground 中的示例代码

如何格式化结构标签以将属性放在正确的元素中?

icz*_*cza 5

您想要的 XML 有 2 个元素:<environment>and <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"`
}
Run Code Online (Sandbox Code Playgroud)

测试它:

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)
}
Run Code Online (Sandbox Code Playgroud)

它产生所需的输出(在Go Playground上尝试):

<environment>
  <temperature type="float" unit="c">-11.3</temperature>
</environment>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用",innerxml"告诉编码器逐字写入值的标签,您会得到相同的结果,而不受通常的编组过程的约束:

type temperature struct {
    Temperature string `xml:",innerxml"`
    Type        string `xml:"type,attr"`
    Units       string `xml:"unit,attr"`
}
Run Code Online (Sandbox Code Playgroud)

输出是一样的。在Go Playground上试试这个。