2
XML元素的異質名單我有一個這樣的XML文檔:解組圍棋
<val>
<alpha β='γ'/>
<α δ='ε'/>
(a whole bunch of the above, in random order)
</val>
換句話說
,異質列表。我想使用Go encoding/xml
軟件包對它進行解組。我怎樣才能做到這一點?
XML元素的異質名單我有一個這樣的XML文檔:解組圍棋
<val>
<alpha β='γ'/>
<α δ='ε'/>
(a whole bunch of the above, in random order)
</val>
換句話說
,異質列表。我想使用Go encoding/xml
軟件包對它進行解組。我怎樣才能做到這一點?
您無法在Go中建模這樣的XML文檔,並且您無法解組爲interace{}
,所以我建議事件驅動的解析爲此。
此事件驅動解析意味着當您解析XML文檔(的標記)時,您會收到類似於「遇到的開始元素」或「遇到的結束元素」(包含當然元素的細節)等事件,以及這些事件控制你的程序流(分支和/或基於它們改變內部狀態)。
以下示例將向您顯示此原則。它不處理更復雜的XML,因爲我希望這個例子很短,但是這種技術可以用來解析任何XML文檔。
使用xml.NewDecoder()
創建xml.Decoder
,並通過反覆調用Decoder.Token()
(在循環中)解析XML的內容。
type Entry struct {
Name string
Attr string
Value string
}
func main() {
decoder := xml.NewDecoder(strings.NewReader(src))
entries := []Entry{}
for {
t, err := decoder.Token()
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
break
}
if se, ok := t.(xml.StartElement); ok && len(se.Attr) > 0 {
entries = append(entries, Entry{
Name: se.Name.Local,
Attr: se.Attr[0].Name.Local,
Value: se.Attr[0].Value,
})
}
}
fmt.Printf("%+v\n", entries)
}
const src = `<val>
<alpha β='γ'/>
<α δ='ε'/>
<x y='z'/>
</val>`
輸出(嘗試在Go Playground):
[{Name:alpha Attr:β Value:γ} {Name:α Attr:δ Value:ε} {Name:x Attr:y Value:z}]
這如何可能在將來有可能相關建議
內
<val>
元素將在[]Entry
類型的片收集,以防人們有興趣參與討論(儘管事件驅動解析可能仍然是更好的選擇):https://github.com/golang/go/issues/13504 –