2016-08-05 14 views
2

Ich habe Probleme unmarshalling die XML unten, wie finde ich alle <info> Knoten mit type="Genres" und speichern ihre Werte innerhalb eines []Genre?XML-Unmarshalling mit Go: Wie finde ich Attribute mit dem gleichen Wert?

<manga id="4199" type="manga" name="Jinki: Extend" precision="manga"> 
    <info type="Main title" lang="EN">Jinki: Extend</info> 
    <info type="Genres">action</info> 
    <info type="Genres">science fiction</info> 
    <info type="Themes">mecha</info> 
    <info type="Number of tankoubon">9</info> 
    <info type="Number of pages">186</info> 
</manga> 

Ich suche die Werte in structs ähnlich wie diese speichern:

// Manga struct 
type Manga struct { 
    WorkID int  `xml:"id,attr"` 
    Name  string `xml:"name,attr"` 
    Precision string `xml:"precision,attr"` 
    Genres []Genre `[this is the part I need help on]` 
} 

// Genre struct 
type Genre struct { 
    Value string 
} 

Ich weiß, dass das XML ist nicht ideal, aber es ist, was ich habe, mit zu arbeiten, ich hoffe, euch kann mir dabei helfen.

Vielen Dank im Voraus.

Antwort

3

Da <manga> eine Liste der <info> Elemente enthält, ist es sinnvoller, eine Liste von Info structs zu haben, anstatt zu versuchen, die <info> Elemente in verschiedene Typen zu übersetzen. Ich würde die Datenstrukturen wie definieren:

type Manga struct { 
    WorkID int `xml:"id,attr"` 
    Name  string `xml:"name,attr"` 
    Precision string `xml:"precision,attr"` 
    Info  []Info `xml:"info"` 
} 

type Info struct { 
    Type string `xml:"type,attr"` 
    Value string `xml:",chardata"` 
} 

Der Ausgang (json für Bequemlichkeit codiert) wie folgt aussieht:

{ 
    "WorkID": 4199, 
    "Name": "Jinki: Extend", 
    "Precision": "manga", 
    "Info": [ 
    { 
     "Type": "Main title", 
     "Value": "Jinki: Extend" 
    }, 
    { 
     "Type": "Genres", 
     "Value": "action" 
    }, 
    { 
     "Type": "Genres", 
     "Value": "science fiction" 
    }, 
    { 
     "Type": "Themes", 
     "Value": "mecha" 
    }, 
    { 
     "Type": "Number of tankoubon", 
     "Value": "9" 
    }, 
    { 
     "Type": "Number of pages", 
     "Value": "186" 
    } 
    ] 
} 
0

Falls die XML nicht nicht sehr groß, ich würde nur ein Dienstprogramm schreiben Funktion wie:

type Manga struct { 
    WorkID int `xml:"id,attr"` 
    Name  string `xml:"name,attr"` 
    Precision string `xml:"precision,attr"` 
    Info  []Info `xml:"info"` 
} 

type Info struct { 
    Type string `xml:"type,attr"` 
    Data string `xml:",chardata"` 
} 

func (m *Manga) Genres() []Info { 
    var g []Info 

    for _, v := range m.Info { 
     if v.Type == "Genres" { 
      g = append(g, v) 
     } 
    } 
    return g 

} 

sehen sie in Aktion: https://play.golang.org/p/bebUwwbSwG