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
Libérer: 2024-12-11 20:49:15
original
363 Les gens l'ont consulté

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

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

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

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!

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