使用Go语言解析嵌套XML

3
我有下面的代码片段,我一直在努力使它工作。我已经到处搜索解决方案,但我找到的所有方法都似乎不起作用。
看来我的映射对于 xml.Unmarshal 命令有问题,因为它涉及到嵌套字段。下面的代码可以正常工作,用于检索第一个名称为 unit 的值,该值位于xml代码的顶层。
另外两个字段显示为零,并且它们嵌套了两层。这意味着结构设置不正确。以下是代码。
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)
}

以下是输出结果:

Wh 0.000000 0

2
我这里没有看到问题... - Brick
你正在忽略unmarshal的错误,试图将日期解组为整数,并且datevalues字段未导出,因此xml包无法看到它。 - JimB
1个回答

12

首先,你的代码不能工作是因为你应该使用导出字段来进行编组/解组(请参阅https://golang.org/pkg/encoding/xml/)。
你应该使用

type pv struct {
    XMLName    xml.Name  `xml:"series"`
    Unit       string    `xml:"unit"`
    Datevalues datevalue `xml:"values>dateValue"`
}

而不是

type pv struct {
    XMLName    xml.Name  `xml:"series"`
    Unit       string    `xml:"unit"`
    datevalues datevalue `xml:"values>dateValue"`
}

看一下DateValues字段名。如果首字母大写,它将被导出。否则,在Unmarshal时将忽略该字段。

第二:

之后我注意到你忽略了错误。请不要忽略它们,它们非常有用。

go playgroung上检查一下。

正如你所看到的,你在datatypeDate字段中使用了int数据类型。 如果你把类型改成string,你的代码就可以工作了。

第三:

我认为你真的想把date值反序列化为time.Time
为了实现这个目标,你可以参考这个相关问题

你可以在go playground上尝试完整的工作代码。


谢谢回复。我没意识到结构体内的字段必须导出才能正常工作。 - Tracy J

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