我目前有以下XML
<monster name="Valkyrie" nameDescription="a valkyrie" race="blood" experience="85" speed="190" manacost="450">
<health now="190" max="190" />
<look type="139" head="113" body="57" legs="95" feet="113" corpse="20523" />
<voices interval="5000" chance="10">
<voice sentence="Another head for me!" />
<voice sentence="Head off!" />
<voice sentence="Your head will be mine!" />
<voice sentence="Stand still!" />
<voice sentence="One more head for me!" />
</voices>
</monster>
我正在使用以下结构阅读它
type monster struct {
XMLName xml.Name `xml:"monster"`
Name string `xml:"name,attr"`
NameDescription string `xml:"nameDescription,attr"`
Race string `xml:"race,attr"`
Experience int `xml:"experience,attr"`
Speed int `xml:"speed,attr"`
ManaCost int `xml:"manacost,attr"`
Health monsterHealth `xml:"health"`
Look monsterLook `xml:"look"`
Voices monsterVoice `xml:"voices"`
}
type monsterVoice struct {
Voices []monsterSentence
}
type monsterSentence struct {
XMLName xml.Name `xml:"voice"`
Sentence string `xml:"sentence,attr"`
}
type monsterLook struct {
Type int `xml:"type,attr"`
Head int `xml:"head,attr"`
Body int `xml:"body,attr"`
Legs int `xml:"legs,attr"`
Feet int `xml:"feet,attr"`
Corpse int `xml:"corpse,attr"`
}
type monsterHealth struct {
Now int `xml:"now,attr"`
Max int `xml:"max,attr"`
}
但是我不确定如何阅读声音元素
最佳答案
您只是错过了为Voices
指定XML元素映射:
type monsterVoice struct {
Voices []monsterSentence `xml:"voice"`
}
进行少量添加之后,照常进行解组即可:
var result monster
err := xml.Unmarshal([]byte(your_xml_data_string), &result)
if err != nil {
fmt.Println(err)
}
for _, r := range result.Voices.Voices {
fmt.Println(r.Sentence)
}
playground demo 1
更好的是,删除
monsterVoice
并使用子选择器,如下所示:type monster struct {
XMLName xml.Name `xml:"monster"`
....
Voices []monsterSentence `xml:"voices>voice"`
}
然后,我们可以摆脱之前的演示中笨拙的
result.Voices.Voices
:for _, r := range result.Voices {
fmt.Println(r.Sentence)
}
playground demo 2
输出:(两个演示都产生相同的输出)
Another head for me!
Head off!
Your head will be mine!
Stand still!
One more head for me!