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

一个简单的xml元素如何解组到golang结构?,xml,struct,go,unmarshalling,Xml,Struct,Go,Unmarshalling,假设以下xml元素具有一个属性和一个浮点值: <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> XMLName属性的用法让我感到困惑。什么时候应该将它放在结构中,什么时候作为标记放在包装器中?下面,您可以找到用于解组给定数据的代码 在去掉空格之前,无法正确取消对浮点值的编组 可以使用“、chardata”注释引用标记的内容 您不需要在结构中指定xml.Name字段,

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

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

XMLName属性的用法让我感到困惑。什么时候应该将它放在结构中,什么时候作为标记放在包装器中?

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

  • 在去掉空格之前,无法正确取消对浮点值的编组
  • 可以使用“、chardata”注释引用标记的内容
  • 您不需要在结构中指定
    xml.Name
    字段,只要不含糊应该使用哪个结构即可

  • 主程序包
    进口(
    “编码/xml”
    “fmt”
    )
    类型根结构{
    Things[]Thing`xml:“Thing”`
    }
    类型事物结构{
    Prop int`xml:“Prop,attr”`
    值float64`xml:,chardata“`
    }
    func main(){
    数据:=`
    1.23
    4.56
    `
    事物:=&根{}
    err:=xml.Unmarshal([]字节(数据),thing)
    如果错误!=零{
    fmt.Println(错误)
    返回
    }
    fmt.Println(东西)
    }
    
    如果文档中不包含
    元素,这将如何工作?@Kiril XML文件中必须有一个根元素。
    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    // ???
    }
    
    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)
    }