首頁 > 後端開發 > Golang > 如何在不使用 XPath 的情況下在 Go 中高效地遍歷 XML 後代?

如何在不使用 XPath 的情況下在 Go 中高效地遍歷 XML 後代?

Linda Hamilton
發布: 2024-12-03 20:15:17
原創
993 人瀏覽過

How Can I Efficiently Traverse XML Descendants in Go Without Using XPath?

使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板