ホームページ >バックエンド開発 >Golang >Golang で XML 構造を効率的にクロールおよび処理するにはどうすればよいですか?

Golang で XML 構造を効率的にクロールおよび処理するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-11 20:49:15372ブラウズ

How Can I Efficiently Crawl and Process XML Structures in Golang?

Golang での XML 構造のクローリング

XML 解析の世界では、xml.Unmarshal メソッドは、XML データを Go 構造体に変換するための構造化されたアプローチを提供します。ただし、文書全体を動的にナビゲートしようとする場合、その制約により課題が生じます。

次のような 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 の力を活用できます。 walk 関数:

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)
        }
    }
}

このアプローチにより、ドキュメント全体を横断してそれぞれのドキュメントを処理できるようになります。

属性を使用した拡張ソリューション

属性へのアクセスが必要な場合は、次の更新バージョンを参照してください:

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)
}

このアプローチの利点:

  • 複雑さや順序に関係なく、XML 構造を柔軟にナビゲートできます。
  • ネストされたノードの処理プロセスが簡素化されます。
  • ノードとその属性を構造化された方法で処理できます。

以上がGolang で XML 構造を効率的にクロールおよび処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。