2016-12-14 29 views
1

屬性的XML文檔我有一個看起來像這樣與golang

<?xml version="1.0"?> 
<!DOCTYPE venue SYSTEM "z.dtd"> 
<venue> 
<c> 
    <a n="k1"><i>0</i></a> 
    <a n="k2"><b v="f"/></a> 
</c> 
</venue> 

我想提取K1(整數)0的XML文檔,也K2(布爾),假

哪有我用「encoding/xml」來做到這一點?

回答

2

你有你的XML結構與圍棋結構模型。

對於可能具有變化的內容(子元素)的元素,一種選擇是列出所有可能的變型,並且僅遇到元件將被解組。

你的XML結構可以這樣建模:

type Venue struct { 
    As []A `xml:"c>a"` 
} 

type A struct { 
    N string `xml:"n,attr"` 
    I I  `xml:"i"` 
    B B  `xml:"b"` 
} 

type I struct { 
    I int `xml:",chardata"` 
} 

type B struct { 
    V bool `xml:"v,attr"` 
} 

和代碼來解組​​XML文檔:

func main() { 
    var v Venue 
    err := xml.Unmarshal([]byte(data), &v) 
    fmt.Printf("%+v %v", v, err) 
} 

const data = `<?xml version="1.0"?> 
<!DOCTYPE venue SYSTEM "z.dtd"> 
<venue> 
<c> 
    <a n="k1"><i>1</i></a> 
    <a n="k2"><b v="f"/></a> 
</c> 
</venue>` 

輸出(嘗試在Go Playground):

{As:[{N:k1 I:{I:1} B:{V:false}} {N:k2 I:{I:0} B:{V:false}}]} <nil> 

正如你所看到的,Venue.As片的第一個元素A.N=k1,它具有A.I.I=1價值,這是從XML拍攝。

Venue.As切片的第二個元素具有A.N=k2,它具有取自XML的A.B.V=false值。

如果你煩惱的是,「包裝」 A結構既包含IB領域(即使只有其中一個包含有效的數據),你可以聲明他們是指針,而一個不存在在XML將nil(使它明顯,容易辨別哪些元素是在XML存在):

type A struct { 
    N string `xml:"n,attr"` 
    I *I  `xml:"i"` 
    B *B  `xml:"b"` 
} 

輸出這段時間(嘗試在Go Playground):

{As:[{N:k1 I:0x1050e24c B:<nil>} {N:k2 I:<nil> B:0x1050e2f5}]} <nil>