ホームページ >バックエンド開発 >Golang >XML を直接 Go マップに効率的にアンマーシャリングするにはどうすればよいですか?

XML を直接 Go マップに効率的にアンマーシャリングするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-18 01:53:10265ブラウズ

How Can I Efficiently Unmarshal XML Directly into a Go Map?

XML をマップに直接アンマーシャリングする

XML データを中間構造体にアンマーシャリングし、その後マップに変換することは、大規模なデータ セットの場合に時間がかかる場合があります。このような場合、マップに直接アンマーシャリングする方が効率的です。

XML をマップに直接アンマーシャリングするには、xml.Unmarshaler インターフェイスを実装するカスタム タイプを作成できます。この型はアンマーシャリング プロセスを処理し、データをマップ[文字列]文字列に保存します。

例:

type classAccessesMap struct {
    m map[string]string
}

// UnmarshalXML implements the xml.Unmarshaler interface to unmarshal XML directly into the map.
func (c *classAccessesMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    c.m = map[string]string{}

    key := ""
    val := ""

    // Iteratively parse XML tokens.
    for {
        t, _ := d.Token()
        switch tt := t.(type) {

        // TODO: Handle the inner structure parsing here.

        case xml.StartElement:
            key = tt.Name.Local

        case xml.EndElement:
            // Store the key-value pair in the map when the end of the "enabled" element is reached.
            if tt.Name.Local == "enabled" {
                c.m[key] = val
            }

            // Return nil when the end of the "classAccesses" element is reached.
            if tt.Name == start.Name {
                return nil
            }
        }
    }
}

使用法:

// Unmarshal the XML into the custom classAccessesMap type.
var classAccessesMap classAccessesMap
if err := xml.Unmarshal([]byte(xmlData), &classAccessesMap); err != nil {
    // Handle error
}

fmt.Println(classAccessesMap.m) // Prints the map containing the parsed data.

以上がXML を直接 Go マップに効率的にアンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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