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 –