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 :
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), &start) }
Avantages de cette approche :
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!