在 XML 解析領域,xml.Unmarshal 方法提供了一種將 XML 資料轉換為 Go 結構的結構化方法。然而,當您尋求動態導航整個文件時,它的限制提出了挑戰。
考慮這樣的 XML結構:
<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>
要按順序導航此結構,您需要一個方法來:
帶有遞歸的普通解決方案
要實現此目的,您可以透過遞歸結構和簡單的遍歷函數來利用普通編碼/xml的強大功能:
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) } } }
這種方法使您能夠遍歷整個文件並將每個節點處理為
帶有屬性的增強解決方案
如果您需要存取屬性,這裡有一個更新版本:
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) }
的好處這種方法:
以上是如何在Golang中有效率地抓取和處理XML結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!