英文:
Unmarshall XML to embedded struct in go
问题
我有一个扁平的XML结构,我想将其解组成一个包含一个嵌入部分的结构体。这可能吗?语法是什么,或者我可以编写什么自定义方法?
在这个例子中,我用xml:""
标记嵌套的结构体,这个标记会被"encoding/xml"跳过。
type FloatHolder struct {
Value float32 `xml:"value"`
}
type pv struct {
XMLName xml.Name `xml:"series"`
Test1 FloatHolder `xml:""` // 不会填充 :-(
Test2 FloatHolder `xml:"nested"` // 会填充
}
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"
Playground: https://play.golang.org/p/aEdDLFYqL5
谢谢!
英文:
I have a flat XML structure, which I want to unmarshall in to a struct which has one part embedded. Is this possible? What is the syntax, or what custom method can I write?
In this example, I tag the nested struct with a guess: xml:""
, which is skipped over by "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)
}
Output: "0.000000 1234.000000"
Playground: https://play.golang.org/p/aEdDLFYqL5
Thanks!
答案1
得分: 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链接:https://play.golang.org/p/-mWrUMJXxX
英文:
EDIT: After comment interaction.
Yes you can. Let's say
XML:
<series>
<value>123456</value>
</series>
Struct definition:
type FloatHolder struct {
Value float32 `xml:",chardata"`
}
type pv struct {
XMLName xml.Name `xml:"series"`
Test2 FloatHolder `xml:"value"`
}
Go Playground link: https://play.golang.org/p/9sWQaw0HlS
Actually it's not a nested field, as per your XML. It belongs to series
element.
Update your struct to following:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论