Dalam dunia penghuraian XML, kaedah xml.Unmarshal menyediakan pendekatan berstruktur untuk menukar data XML kepada struktur Go. Walau bagaimanapun, kekangannya memberikan cabaran apabila anda berusaha untuk menavigasi keseluruhan dokumen secara dinamik.
Pertimbangkan struktur XML seperti ini:
<content> <p>this is content area</p> <animal> <p>This id dog</p> <dog> <p>tommy</p> </dog> </animal> <birds> <p>this is birds</p> <p>this is birds</p> </birds> <animal> <p>this is animals</p> </animal> </content>
Untuk menavigasi struktur ini secara berurutan, anda memerlukan kaedah untuk :
Penyelesaian Vanila dengan Rekursi
Untuk mencapainya, anda boleh memanfaatkan kuasa pengekodan/xml vanila dengan struktur rekursif dan fungsi berjalan mudah :
type Node struct { XMLName xml.Name Content []byte `xml:",innerxml"` Nodes []Node `xml:",any"` } func walk(nodes []Node, f func(Node) bool) { for _, n := range nodes { if f(n) { walk(n.Nodes, f) } } }
Pendekatan ini membolehkan anda melintasi keseluruhan dokumen dan mengendalikan setiap nod sebagai diperlukan.
Penyelesaian Dipertingkat dengan Atribut
Jika anda memerlukan akses kepada atribut, berikut ialah versi yang dikemas kini:
type Node struct { XMLName xml.Name Attrs []xml.Attr `xml:",any,attr"` Content []byte `xml:",innerxml"` Nodes []Node `xml:",any"` } func (n *Node) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { n.Attrs = start.Attr type node Node return d.DecodeElement((*node)(n), &start) }
Faedah Pendekatan ini:
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Merangkak dan Memproses Struktur XML dengan Cekap di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!