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

时间:2016-03-03 13:06:25

标签: xml go

我获得了以下XML结构

<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>

我想将其解组为以下内容:

type Property string {
    Name string
    Value string
}

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

但我不知道如何处理无序属性

1 个答案:

答案 0 :(得分:2)

encoding/xml包会为您处理。您只需要正确地标记您的结构字段,以告诉xml包在XML源中如何找到它们:

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

请注意,我将DateTime字段的类型更改为string,因为XML中的时间戳(13 Jan 2015 14:13:15GMT)不符合标准(ISO 8601,在Go布局中:2006-01-02T15:04:05Z07:00,即time.RFC3339)。

解组编码:

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

输出(在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}

即使Props<datetime>标签插入其中,您也可以看到<categorisation>正确包含所有7个属性的正确顺序。