使用Go解组嵌套的xml

时间:2015-11-06 00:30:04

标签: xml go nested unmarshalling

我有以下代码片段,我一直在试图让它起作用。我到处寻找解决方案,但我找到的那些似乎都没有。

似乎我的HashMap<Integer, ArrayList<String>>命令映射存在问题,因为它与嵌套字段有关。下面的代码用于检索名为xml.Unmarshal的第一个值,并且位于xml代码的顶层。

另外两个字段为零,它们嵌套在两层深处。这意味着结构没有正确设置。这是代码。

unit

这是输出:

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)
}

1 个答案:

答案 0 :(得分:4)

首先您的所有代码都不起作用,因为您应该使用导出字段进行编组/解组(请参阅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

上查看

如您所见,您对int的{​​{1}}字段使用Date数据类型。 如果您将类型更改为datatype,则代码将有效。

<强>第三

我认为您确实希望将string值解组为date 为此,您可以查看this related question

您可以尝试 go playground

的完整工作代码