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

时间:2014-11-13 14:55:17

标签: xml struct go unmarshalling

假设以下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属性的使用让我感到困惑。什么时候应该放在结构中,什么时候放在包装器中作为标签?

1 个答案:

答案 0 :(得分:5)

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

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

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