2016-03-03 45 views
2

我一直在考慮下面的XML結構轉到:和解組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 
} 

,但我不知道該怎麼處理故障屬性

回答

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:00time.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級性能插入它們之間。

+0

太棒了,謝謝 – Xetius