Go での XML データ トラバーサル
問題:
XML データは、多くの場合、課題を引き起こします。 XPath についての事前知識がなくても、特定の要素にアクセスできるようになります。 xml.Unmarshal メソッドにはこの点で制限があり、ユーザーはデータを取得するための正確なパスを指定する必要があります。
解決策:
XML データを柔軟に走査するには、次のようにします。単純なウォーク関数とともに再帰的データ構造を利用します。
再帰的データ構造:
type Node struct { XMLName xml.Name Content []byte `xml:",innerxml"` Nodes []Node `xml:",any"` }
この構造では、各ノードは、名前、内部 XML コンテンツ (ネストされていない要素の場合)、および子ノードのスライスを含む XML ドキュメント内の要素を表します。
ウォーク関数:
func walk(nodes []Node, f func(Node) bool) { for _, n := range nodes { if f(n) { walk(n.Nodes, f) } } }
再帰的なウォーク関数ノード ツリーをトラバースし、検出されたノードごとに提供された関数 f を呼び出します。
使用法:
XML ドキュメントをトラバースし、それに応じて要素を処理するには:
例:
次のコード質問内の XML ドキュメントを走査し、要素名を次の順序で出力します:
content := Node{} if err := xml.Unmarshal([]byte(rawXML), &content); err != nil { // Handle error } walk(content.Nodes, func(n Node) bool { fmt.Println(n.XMLName.Local) return true })
出力:
content p animal p dog p birds p p animal p
以上がXPath を使用せずに Go で XML データを効率的に走査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。