我被迫使用一些设计不佳的XML,我试图将这个XML读入Go结构。以下是一些示例数据:
<?xml version="1.0" encoding="UTF-8"?>
<dictionary>
<direction from="lojban" to="English">
<valsi word="cipni" type="gismo">
<rafsi>cpi</rafsi>
<definition>x1 is a bird of species x2</definition>
<notes></notes>
</valsi>
...
</direction>
<direction from="English" to="lojban">
<nlword word="eagle" valsi="atkuila" />
<nlword word="hawk" sense="bird" valsi="aksiptrina" />
...
</direction>
</dictionary>
我的问题是我可以读取节点,也可以包含属性“word”:
main.NLWord field "Word" with tag "word,attr" conflicts with field "Valsi" with tag "word,attr"
我开始认为解组可能是错误的方法,因为我理想地以不同的方式构建数据。我应该使用其他方法读取XML并手动构建数据结构吗?
type Valsi struct {
Word string `xml:"word,attr"`
Type string `xml:"type,attr"`
Def string `xml:"definition"`
Notes string `xml:"notes"`
Class string `xml:"selmaho"`
Rafsi []string `xml:"rafsi"`
}
//Whoever made this XML structure needs to be painfully taught a lesson...
type Collection struct {
From string `xml:"from"`
To string `xml:"to"`
Valsi []Valsi `xml:"valsi"`
}
type Vlaste struct {
Direction []Collection `xml:"direction"`
}
var httpc = &http.Client{}
func parseXML(data []byte) Vlaste {
vlaste := Vlaste{}
err := xml.Unmarshal(data, &vlaste)
if err != nil {
fmt.Println("Problem Decoding!")
log.Fatal(err)
}
return vlaste
}
答案 0 :(得分:2)
我可能没有理解你的问题,但以下结构对我来说很好 (your modified example on play):
type Valsi struct {
Word string `xml:"word,attr"`
Type string `xml:"type,attr"`
Def string `xml:"definition"`
Notes string `xml:"notes"`
Class string `xml:"selmaho"`
Rafsi []string `xml:"rafsi"`
}
type NLWord struct {
Word string `xml:"word,attr"`
Sense string `xml:"sense,attr"`
Valsi string `xml:"valsi,attr"`
}
type Collection struct {
From string `xml:"from,attr"`
To string `xml:"to,attr"`
Valsi []Valsi `xml:"valsi"`
NLWord []NLWord `xml:"nlword"`
}
type Vlaste struct {
Direction []Collection `xml:"direction"`
}
在此结构中,Collection
可以包含Valsi
个值以及NLWord
个值。
然后,您可以根据From
/ To
或Valsi
或NLWord
的长度决定如何处理数据。