您无法在 Go 中对此类 XML 文档进行建模,也无法将其解组为interace{}
,所以我建议事件驱动为此进行解析。
这种事件驱动的解析意味着当您解析 XML 文档(的标记)时,您会收到诸如“遇到开始元素”或“遇到结束元素”之类的事件(当然还有元素的详细信息),并且这些事件控制程序流程(根据它们分支和/或更改内部状态)。
下面的例子将向您展示其原理。它不处理更复杂的 XML,因为我希望示例简短,但该技术可用于解析任何 XML 文档。
创建一个xml.Decoder using xml.NewDecoder(),并通过调用解析 XML 的内容Decoder.Token()重复(循环)。
里面的元素<val>
将被收集在类型切片中[]Entry
:
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>`
输出(尝试一下去游乐场):
[{Name:alpha Attr:β Value:γ} {Name:α Attr:δ Value:ε} {Name:x Attr:y Value:z}]