Tra*_*y J 2 xml nested go unmarshalling
我有以下代码片段,我一直在努力使其工作。我到处寻找解决方案,但我发现的所有解决方案似乎都不起作用。
我的xml.Unmarshal命令映射似乎有问题,因为它与嵌套字段有关。下面的代码用于检索名为 的第一个值,它位于unitxml 代码的顶层。
其他两个字段为零,它们嵌套了两级深。这意味着结构设置不正确。这是代码。
package main
import (
"encoding/xml"
"fmt"
)
type datevalue struct {
Date int `xml:"date"`
Value float32 `xml:"value"`
}
type pv struct {
XMLName xml.Name `xml:"series"`
Unit string `xml:"unit"`
datevalues datevalue `xml:"values>dateValue"`
}
func main() {
contents := `<series>
<timeUnit>DAY</timeUnit>
<unit>Wh</unit><measuredBy>INVERTER</measuredBy>
<values><dateValue>
<date>2015-11-04 00:00:00</date>
<value>5935.405</value>
</dateValue></values>
</series>`
m := &pv{}
xml.Unmarshal([]byte(contents), &m)
fmt.Printf("%s %f %d\n", m.Unit, m.datevalues.Value, m.datevalues.Date)
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
Wh 0.000000 0
Run Code Online (Sandbox Code Playgroud)
首先 ,您的代码不起作用,因为您应该使用导出的字段进行编组/解组(请参阅https://golang.org/pkg/encoding/xml/)。
你应该使用
type pv struct {
XMLName xml.Name `xml:"series"`
Unit string `xml:"unit"`
Datevalues datevalue `xml:"values>dateValue"`
}
Run Code Online (Sandbox Code Playgroud)
代替
type pv struct {
XMLName xml.Name `xml:"series"`
Unit string `xml:"unit"`
datevalues datevalue `xml:"values>dateValue"`
}
Run Code Online (Sandbox Code Playgroud)
查看 DateValues 字段名称。如果第一个符号是大写的,它将被导出。否则该字段将被忽略,而Unmarshal
第二:
之后我注意到你忽略了你的错误。请不要忽视它们,它们非常有用。
检查一下 go playgroung
正如你可以看到你使用的int数据类型Date的字段datatype。如果您将 type 更改为string,您的代码将起作用。
第三:
我认为您真的想将您的date价值解组为time.Time.
为此,您可以检查此相关问题
您可以尝试的完整工作代码 go playground