一尘不染

一个简单的xml元素如何解组到golang结构?

go

假设以下xml元素具有属性和浮点值:

<thing prop="1">
  1.23
</thing>
<thing prop="2">
  4.56
</thing>

为了解组它,我应该如何定义我的结构?

type ThingElem struct {
    Prop  int   `xml:"prop,attr"`
    Value float // ???
}

type ThingWrapper struct {
    T ThingElem `xml:"thing"`
}

// VS

type ThingElem struct {
    XMLName xml.Name `xml:"thing"` // Do I even need this?
    Prop    int      `xml:"prop,attr"`
    Value   float    // ???
}

XMLName属性的用法使我感到困惑。什么时候应该将其放置在结构中,何时将其作为标签包装?


阅读 328

收藏
2020-07-02

共1个答案

一尘不染

在下面,您可以找到解组给定数据的代码。

  1. 在删除空格之前,无法正确解组浮点值。
  2. 可以使用“,chardata”注释引用标记的内容。
  3. 您无需xml.Name在结构中指定字段,只要它不模糊应使用哪种结构即可。

package main

import (
    "encoding/xml"
    "fmt"
)

type Root struct {
    Things []Thing `xml:"thing"`
}

type Thing struct {
    Prop  int     `xml:"prop,attr"`
    Value float64 `xml:",chardata"`
}

func main() {
    data := `
<root>
<thing prop="1">1.23</thing>
<thing prop="2">4.56</thing>
</root>
`
    thing := &Root{}
    err := xml.Unmarshal([]byte(data), thing)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(thing)
}
2020-07-02