2016-06-04 5 views
0

Ich habe derzeit folgende XMLGo unmarshall 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> 

Und ich lese die folgenden structs mit

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"` 
} 

Aber ich bin nicht sicher, wie die Stimmen Element lesen

Antwort

2

Sie verfehlten nur auf XML-Element-Mapping für Voices angeben:

type monsterVoice struct { 
    Voices []monsterSentence `xml:"voice"` 
} 

nach diesem kleinen Zusatz, unmarshalling wie üblich funktionieren sollte:

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

Wette ter noch fallen monsterVoice und Kind-Selektor wie so:

type monster struct { 
    XMLName xml.Name `xml:"monster"` 
    .... 
    Voices []monsterSentence `xml:"voices>voice"` 
} 

Dann können wir loswerden der peinliche result.Voices.Voices in der vorherigen Demo erhalten:

for _, r := range result.Voices { 
    fmt.Println(r.Sentence) 
} 

playground demo 2

Ausgabe: (beide Demo liefert die gleiche Ausgabe)

Another head for me! 
Head off! 
Your head will be mine! 
Stand still! 
One more head for me! 
Verwandte Themen