Maison >développement back-end >Golang >Comment puis-je parcourir efficacement des données XML en Go sans utiliser XPath ?

Comment puis-je parcourir efficacement des données XML en Go sans utiliser XPath ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-29 06:57:10469parcourir

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

Traversée de données XML dans Go

Problème :

Les données XML présentent souvent des défis lorsqu'elles vient à accéder à des éléments spécifiques sans connaissance préalable de leur XPath. La méthode xml.Unmarshal présente des limites à cet égard, obligeant les utilisateurs à spécifier des chemins exacts pour obtenir des données.

Solution :

Pour parcourir les données XML de manière flexible, nous pouvons utiliser une structure de données récursive ainsi qu'une simple fonction de marche.

Données récursives Structure :

type Node struct {
    XMLName xml.Name
    Content []byte `xml:",innerxml"`
    Nodes   []Node `xml:",any"`
}

Dans cette structure, chaque nœud représente un élément du document XML, contenant son nom, le contenu XML interne (pour les éléments non imbriqués) et une tranche de nœuds enfants.

Fonction Walk :

func walk(nodes []Node, f func(Node) bool) {
    for _, n := range nodes {
        if f(n) {
            walk(n.Nodes, f)
        }
    }
}

La fonction walk parcourt récursivement l'arborescence des nœuds, appeler la fonction f fournie pour chaque nœud rencontré.

Utilisation :

Pour parcourir un document XML et traiter ses éléments en conséquence :

  1. Dégroupez les données XML dans une structure Node.
  2. Définissez une fonction de filtre f qui spécifie les critères de traitement des nœuds (par exemple, en fonction du nom ou du contenu de l'élément).
  3. Appelez la fonction walk avec le nœud racine et la fonction de filtre comme paramètres.

Exemple :

Le code suivant parcourt le document XML dans la question, imprimant les noms des éléments dans commande :

content := Node{}
if err := xml.Unmarshal([]byte(rawXML), &content); err != nil {
    // Handle error
}

walk(content.Nodes, func(n Node) bool {
    fmt.Println(n.XMLName.Local)
    return true
})

Sortie :

content
p
animal
p
dog
p
birds
p
p
animal
p

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!

Déclaration:
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