转至:解组包含不同实体的XML列表

I have been given the following XML structure

<properties>
    <property name="element1">data1</property>
    <property name="element2">data2</property>
    <datetime name="start">13 Jan 2015 14:13:15GMT</datetime>
    <property name="element3">data3</property>
    <property name="element4">data4</property>
    <property name="element5">data5</property>
    <categorisation name="category">cat1</categorisation>
    <property name="element6">data6</property>
    <property name="element7">data7</property>
</properties>

I want to unmarshall it into the following:

type Property string {
    Name string
    Value string
}

type Properties struct {
    Props []Property 
    DateTime time.Time
    Category string
}

but I don't know how to process the out of order Properties

The encoding/xml package handles that for you. You just have to properly tag your struct fields to tell the xml package how they are found in the XML source:

type Property struct {
    Name  string `xml:"name,attr"`
    Value string `xml:",cdata"`
}

type Properties struct {
    Props    []Property `xml:"property"`
    DateTime string     `xml:"datetime"`
    Category string     `xml:"categorisation"`
}

Note that I changed the type of DateTime field to string because the timestamp in the XML (13 Jan 2015 14:13:15GMT) does not conform to standard (which would be ISO 8601, in Go layout: 2006-01-02T15:04:05Z07:00 which is time.RFC3339).

Code to unmarshal:

ps := Properties{}
if err := xml.Unmarshal([]byte(src), &ps); err != nil {
    panic(err)
}
fmt.Printf("%+v", ps)

Output (try it on the Go Playground):

{Props:[{Name:element1 Value:data1} {Name:element2 Value:data2} {Name:element3 Value:data3}
 {Name:element4 Value:data4} {Name:element5 Value:data5} {Name:element6 Value:data6}
 {Name:element7 Value:data7}] DateTime:13 Jan 2015 14:13:15GMT Category:cat1}

You can see that Props properly contains all 7 properties in correct order even though <datetime> and <categorisation> tags are inserted between them.