使用Go 探索XML 資料
您在Go 中導航XML 資料時面臨著挑戰,特別是找到一種遍歷後代的方法特定節點而不指定確切的XPath。讓我們探索一種可以幫助您完成此任務的方法。
遞歸和Vanilla XML 編碼
要實現深度遍歷,您可以利用遞歸結構和直接遍歷利用Go 的vanilla 編碼/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) } } }
在此程式碼中,步行函數遞歸地存取每個節點的子節點。您可以提供自訂函數 f 來對各個節點執行操作。
例如,在您提供的XML 中,您可以使用walk 函數根據節點的類型來處理節點,如下所示:
func handleNode(n Node) bool { switch n.XMLName.Local { case "p": // Process paragraphs case "dog": // Process dogs } return true // Keep traversing } walk([]Node{root}, handleNode)
屬性包含
如果您需要存取與節點關聯的屬性,您可以擴充Node 結構並相應地自訂UnmarshalXML方法:
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) }
使用此修改後的結構,您可以在walk 函數中檢索屬性:
func handleNode(n Node) bool { for _, a := range n.Attrs { // Process attributes } return true // Keep traversing }
透過利用遞歸和採用普通XML 編碼,您可以有效地遍歷複雜的XML 結構,輕鬆存取節點和屬性。
以上是如何在不使用 XPath 的情況下在 Go 中高效地遍歷 XML 後代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!