你有你的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
結構既包含I
和B
領域(即使只有其中一個包含有效的數據),你可以聲明他們是指針,而一個不存在在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>