去解组 XML

我目前有以下 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"`

}

但我不确定如何阅读声音元素


弑天下
浏览 170回答 2
2回答

慕勒3428872

您刚刚错过了为以下内容指定 XML 元素映射Voices:type monsterVoice struct {&nbsp; &nbsp; Voices []monsterSentence `xml:"voice"`}在那个小小的添加之后,像往常一样解组应该可以工作:var result monstererr := xml.Unmarshal([]byte(your_xml_data_string), &result)if err != nil {&nbsp; &nbsp; fmt.Println(err)}for _, r := range result.Voices.Voices {&nbsp; &nbsp; fmt.Println(r.Sentence)}playground demo 1更好的是,monsterVoice像这样删除并使用子选择器:type monster struct {&nbsp; &nbsp; XMLName xml.Name `xml:"monster"`&nbsp; &nbsp; ....&nbsp; &nbsp; Voices []monsterSentence `xml:"voices>voice"`}那么我们就可以摆脱result.Voices.Voices之前demo中的尴尬了:for _, r := range result.Voices {&nbsp; &nbsp; 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!

函数式编程

只需使用&nbsp;xml.Unmarshal(xmlString, data)这是 xml 解组的完整示例https://golang.org/src/encoding/xml/example_test.go
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go