Maison >développement back-end >Golang >Comment puis-je explorer et traiter efficacement les structures XML dans Golang ?

Comment puis-je explorer et traiter efficacement les structures XML dans Golang ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-11 20:49:15362parcourir

How Can I Efficiently Crawl and Process XML Structures in Golang?

Exploration des structures XML dans Golang

Dans le monde de l'analyse XML, la méthode xml.Unmarshal fournit une approche structurée pour convertir des données XML en structures Go. Cependant, ses contraintes présentent un défi lorsque vous cherchez à parcourir l'ensemble du document de manière dynamique.

Considérez une structure XML comme celle-ci :

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

Pour parcourir cette structure de manière séquentielle, vous avez besoin d'une méthode pour :

  • Traiter chaque nœud et ses enfants
  • S'adapter aux changements dans l'élément order

Solution Vanilla avec récursion

Pour y parvenir, vous pouvez exploiter la puissance de l'encodage Vanilla/xml avec une structure récursive et une simple 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)
        }
    }
}

Cette approche vous permet de parcourir l'intégralité du document et de gérer chaque nœud comme nécessaire.

Solution améliorée avec attributs

Si vous avez besoin d'accéder aux attributs, voici une version mise à jour :

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), &amp;start)
}

Avantages de cette approche :

  • Elle offre une flexibilité dans la navigation dans les structures XML, indépendamment de leur complexité ou de leur ordre.
  • Il simplifie le processus de gestion des nœuds imbriqués.
  • Il vous permet de traiter les nœuds et leurs attributs de manière structurée.

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