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

Golang で XML データを効率的に走査するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-29 12:23:13865ブラウズ

How to Efficiently Traverse XML Data in Golang?

Golang での XML データのトラバース

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 を走査して各ノードとその子を処理するには:

  1. XML をアンマーシャリングしてstruct:

    var content Node
    if err := xml.Unmarshal(xmlData, &content); err != nil {
     // handle error
    }
  2. ウォーク関数を使用して構造体をウォークスルーします:

    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 サイトの他の関連記事を参照してください。

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