ホームページ > バックエンド開発 > Golang > XPath を使用せずに Go で XML データを効率的に走査するにはどうすればよいですか?

XPath を使用せずに Go で XML データを効率的に走査するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-29 06:57:10
オリジナル
462 人が閲覧しました

How Can I Efficiently Traverse XML Data in Go Without Using XPath?

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 ドキュメントをトラバースし、それに応じて要素を処理するには:

  1. XML データをノードにアンマーシャルするstruct.
  2. ノードの処理基準を指定するフィルター関数 f を定義します (要素名またはコンテンツに基づくなど)。
  3. ルート ノードとフィルター関数を使用して walk 関数を呼び出します。 parameters.

例:

次のコード質問内の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート