Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Membongkar teg XML bernombor dalam Go

Membongkar teg XML bernombor dalam Go

PHPz
PHPzke hadapan
2024-02-10 15:36:08911semak imbas

在 Go 中解组编号的 XML 标签

editor php Banana akan memperkenalkan anda kepada kaedah unmarshaling teg XML bernombor dalam bahasa Go. Bahasa Go menyediakan fungsi xml.Unmarshal, yang boleh menyahmarshal data XML ke dalam struktur Go. Apabila unmarshalling, kita boleh menggunakan tag untuk menentukan hubungan pemetaan antara elemen XML dan medan struktur. Dengan menambahkan `xml:"tag"` pada teg medan struktur, kami boleh mengaitkan teg tertentu dalam XML dengan medan struktur untuk mencapai operasi unmarshalling automatik. Kaedah ini mudah dan cekap, menjadikan pemprosesan data XML dalam bahasa Go mudah dan menyeronokkan.

Kandungan soalan

Saya telah mencuba banyak struktur untuk mencuba dan membongkar xml ini tetapi saya tidak dapat memahaminya:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
)

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name          `xml:",any"`
    SettingRegisters []SettingRegister `xml:",any"`
}

type SettingRegister struct {
    XMLName xml.Name `xml:",any"`
    Value   string   `xml:"value,attr"`
}

func main() {
    var xmlData = bytes.NewBufferString(`
    <Settings>
        <Setting0>
            <Setting0_register value="0x20" />
            <Setting0ArbitraryName value="0x0" />
        </Setting0>
        <Setting1>
            <Setting1_register value="0x60" />
            <Setting1WhateverEnable value="0x0" />
        </Setting1>
        <Setting2>
            <Setting2_register value="0x80" />
            <Setting2blahblah value="0x1" />
        </Setting2>
        <Setting4>
            <Setting4_register value="0x2fffff8" />
            <Setting4ThisCanBeAnything value="0x0" />
        </Setting4>
    </Settings>`)

    var s []SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    for _, i := range s {
        fmt.Println(i)
    }
}

Saya tidak boleh mendapatkannya untuk mencetak apa-apa. Medan yang sebenarnya saya perlukan ialah attr nilai settingn_register dan nama tag settingn. Bagaimanakah saya boleh menyahmarshal xml ke dalam medan ini dengan betul? Saya sedang berfikir untuk membuat fungsi unmarshalling tersuai, tetapi saya tidak dapat mencari cara untuk membuatnya dengan betul. Saya hanya mendapat nama teg "tetapan" daripada xml ini.

Penyelesaian

Dari xmlname 字段中删除 xml:",any" 标记(这会导致解码器尝试将额外的子元素映射到此字段),并将其解组为 settingcontainer 而不是 []settingcontainer Sebagai dokumen xml hanya boleh mempunyai satu elemen akar. Contoh kerja di sini: https://www.php.cn/link/d2949eb6aaa490c835219e945ff37dad

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name
    SettingRegisters []SettingRegister `xml:",any"`
}

type SettingRegister struct {
    XMLName xml.Name
    Value   string `xml:"value,attr"`
}

func main() {
    var xmlData = bytes.NewBufferString(`...`)

    var s SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    fmt.Println(s)
}

Atas ialah kandungan terperinci Membongkar teg XML bernombor dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam