Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Melintasi Keturunan XML dengan Cekap dalam Go Tanpa Menggunakan XPath?

Bagaimanakah Saya Boleh Melintasi Keturunan XML dengan Cekap dalam Go Tanpa Menggunakan XPath?

Linda Hamilton
Linda Hamiltonasal
2024-12-03 20:15:171079semak imbas

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

Meneroka Data XML dengan Go

Anda menghadapi cabaran dalam menavigasi data XML dalam Go, khususnya mencari kaedah untuk melintasi keturunan nod tertentu tanpa menyatakan XPath yang tepat. Mari teroka pendekatan yang boleh membantu anda dalam tugasan ini.

Pengekodan XML Rekursi dan Vanila

Untuk mencapai traversal yang dalam, anda boleh menggunakan struktur rekursif dan berjalan lurus fungsi memanfaatkan pakej pengekodan/xml vanila Go:

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)
        }
    }
}

Dalam kod ini, berjalan kaki fungsi melawati setiap anak nod secara rekursif. Anda boleh menyediakan fungsi tersuai f untuk melaksanakan operasi pada nod individu.

Sebagai contoh, dalam XML yang anda berikan, anda boleh menggunakan fungsi berjalan untuk memproses nod berdasarkan jenisnya, seperti ditunjukkan di bawah:

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)

Kemasukan Atribut

Sekiranya anda perlu mengakses atribut yang dikaitkan dengan nod, anda boleh melanjutkan Nod struct dan sesuaikan kaedah UnmarshalXML sewajarnya:

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)
}

Dengan struktur yang diubah suai ini, anda boleh mendapatkan semula atribut dalam fungsi berjalan:

func handleNode(n Node) bool {
    for _, a := range n.Attrs {
        // Process attributes
    }
    return true // Keep traversing
}

Dengan memanfaatkan rekursi dan menerima pengekodan XML vanila, anda boleh melintasi struktur XML yang kompleks dengan berkesan, mengakses nod dan atribut dengan mudah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melintasi Keturunan XML dengan Cekap dalam Go Tanpa Menggunakan XPath?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn