在go中解析XML到嵌入式结构

时间:2017-07-06 23:09:27

标签: xml go unmarshalling

我有一个扁平的XML结构,我想将其解组到一个嵌入了一个部分的结构中。这可能吗?我可以编写什么语法或自定义方法?

在这个例子中,我用一个猜测标记了嵌套的结构:xml:"",它被“encoding / xml”跳过。

type FloatHolder struct {
    Value float32    `xml:"value"`
}


type pv struct {
    XMLName    xml.Name  `xml:"series"`
    Test1 FloatHolder `xml:""`   // does not populate :-(
    Test2 FloatHolder `xml:"nested"` // populates
}
func main() {
    contents := `<series>
                   <nested>
                     <value>1234</value>
                   </nested>
                   <value>1234</value>
                 </series>`

    m := &pv{}

    err := xml.Unmarshal([]byte(contents), &m)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%f %f\n", m.Test1.Value, m.Test2.Value)
}

输出:“0.000000 1234.000000”

游乐场:https://play.golang.org/p/aEdDLFYqL5

谢谢!

1 个答案:

答案 0 :(得分:1)

编辑:评论互动后。

是的,你可以。让我们说

XML:

<series>
    <value>123456</value>
</series>

结构定义:

type FloatHolder struct {
    Value float32 `xml:",chardata"`
}

type pv struct {
    XMLName xml.Name    `xml:"series"`
    Test2   FloatHolder `xml:"value"`
}

Go Playground链接:https://play.golang.org/p/9sWQaw0HlS

实际上,根据您的XML,它不是嵌套字段。它属于series元素。

将您的结构更新为以下内容:

type pv struct {
    XMLName xml.Name    `xml:"series"`
    Test1   float32     `xml:"value"`
    Test2   FloatHolder `xml:"nested"`
}

Go Playground Link:https://play.golang.org/p/-mWrUMJXxX