Maison > développement back-end > Golang > Comment puis-je parcourir efficacement les descendants XML dans Go sans utiliser XPath ?

Comment puis-je parcourir efficacement les descendants XML dans Go sans utiliser XPath ?

Linda Hamilton
Libérer: 2024-12-03 20:15:17
original
997 Les gens l'ont consulté

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

Explorer les données XML avec Go

Vous êtes confronté à des difficultés lors de la navigation dans les données XML dans Go, en particulier pour trouver une méthode pour parcourir les descendants de un nœud particulier sans spécifier le XPath exact. Explorons une approche qui peut vous aider dans cette tâche.

Récursion et codage XML Vanilla

Pour réaliser une traversée approfondie, vous pouvez utiliser une structure récursive et une marche simple fonction exploitant le package d'encodage/xml vanilla de 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)
        }
    }
}
Copier après la connexion

Dans ce code, la fonction walk visite récursivement les enfants de chaque nœud. Vous pouvez fournir une fonction personnalisée f pour effectuer des opérations sur des nœuds individuels.

Par exemple, dans le XML que vous avez fourni, vous pouvez utiliser la fonction walk pour traiter les nœuds en fonction de leur type, comme indiqué ci-dessous :

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)
Copier après la connexion

Inclusion d'attributs

Si vous avez besoin d'accéder aux attributs associés aux nœuds, vous pouvez étendre la structure Node et personnaliser la méthode UnmarshalXML en conséquence :

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)
}
Copier après la connexion

Avec cette structure modifiée, vous pouvez récupérer des attributs dans la fonction walk :

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

En exploitant la récursivité et en adoptant le codage XML Vanilla, vous pouvez efficacement parcourez des structures XML complexes, en accédant facilement aux nœuds et aux attributs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal