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
Lepaskan: 2024-12-03 20:15:17
asal
997 orang telah melayarinya

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)
        }
    }
}
Salin selepas log masuk

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)
Salin selepas log masuk

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)
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan