Maison > développement back-end > Golang > Comment parcourir efficacement les données XML dans Golang ?

Comment parcourir efficacement les données XML dans Golang ?

DDD
Libérer: 2024-11-29 12:23:13
original
923 Les gens l'ont consulté

How to Efficiently Traverse XML Data in Golang?

Parcourir des données XML dans Golang

Pour parcourir des données XML dans Golang, on peut utiliser une approche d'encodage Vanilla/XML en construisant une structure récursive et en employant une fonction de marche .

Définition de structure et fonction de marche

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

Exemple Utilisation

Considérez le XML suivant :

<content>
    <p>this is content area</p>
    <animal>
        <p>This id dog</p>
        <dog>
           <p>tommy</p>
        </dog>
    </animal>
    <birds>
        <p>this is birds</p>
        <p>this is birds</p>
    </birds>
    <animal>
        <p>this is animals</p>
    </animal>
</content>
Copier après la connexion

Pour parcourir le XML et traiter chaque nœud et ses enfants :

  1. Désassemblez le XML en un struct :

    var content Node
    if err := xml.Unmarshal(xmlData, &content); err != nil {
     // handle error
    }
    Copier après la connexion
  2. Parcourir la structure en utilisant la marche function :

    walk(content.Nodes, func(n Node) bool {
     // Process the node or traverse its child nodes here
     fmt.Printf("Node: %s\n", n.XMLName.Local)
     return true
    })
    Copier après la connexion

Version améliorée avec attributs

Pour les nœuds avec attributs, voici une version améliorée :

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

Cela permet d'accéder aux attributs dans la logique de traitement des nœuds.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal