Golang で XML データをトラバースするには、再帰的構造体を構築し、ウォーク関数を使用することにより、バニラ エンコーディング/XML アプローチを利用できます。 .
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) } } }
次の XML について考えます:
<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>
XML を走査して各ノードとその子を処理するには:
XML をアンマーシャリングしてstruct:
var content Node if err := xml.Unmarshal(xmlData, &content); err != nil { // handle error }
ウォーク関数を使用して構造体をウォークスルーします:
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 })
属性を持つノードについては、次の拡張機能があります。 version:
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) }
これにより、ノード処理ロジック内の属性にアクセスできるようになります。
以上がGolang で XML データを効率的に走査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。