Menyahmarshaling Elemen XML dengan Atribut dan Nilai dalam Go
Elemen XML selalunya mengandungi kedua-dua atribut dan nilai. Untuk berjaya menyusun elemen sedemikian ke dalam struktur Golang, adalah penting untuk memahami peranan XMLName dan anotasi ",chardata".
Mentakrifkan Struktur tanpa XMLName
Pertimbangkan XML yang disediakan:
<code class="xml"><thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing></code>
Struktur yang sepadan tanpa medan XMLName boleh menjadi:
<code class="go">type ThingElem struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` }</code>
Prop dianotasi dengan xml:"prop,attr" untuk menunjukkan bahawa ia adalah atribut bagi unsur benda. Nilai dianotasi dengan xml:",chardata" untuk menentukan bahawa ia harus menyimpan kandungan elemen sebagai rentetan.
Memahami XMLName
XMLName boleh digunakan untuk mentakrifkan secara eksplisit nama tag XML sesuatu struct. Dalam kes kami, nama teg XML disimpulkan kerana ia sepadan dengan nama struct (ThingElem). Jadi, XMLName tidak diperlukan dalam senario ini.
Menggunakan Struktur Pembungkus
Jika struktur XML lebih kompleks atau mungkin samar-samar, anda boleh menggunakan struktur pembalut untuk menyediakan konteks tambahan. Sebagai contoh, jika XML mempunyai berbilang elemen perkara dalam elemen akar:
<code class="xml"><root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root></code>
Anda memerlukan struktur pembalut:
<code class="go">type ThingWrapper struct { T ThingElem `xml:"thing"` }</code>
Di sini, T ialah struct terbenam yang mewakili elemen benda.
Membuang Pertimbangan
Untuk data XML yang disediakan, anda perlu mengambil kira ruang putih dalam nilai elemen. Memandangkan XML tidak mengekalkan ruang putih secara lalai, nilai hendaklah dipangkas atau anotasi xml:",innerxml" boleh digunakan.
Struktur yang terhasil boleh dinyahmarshall seperti berikut:
<code class="go">package main import ( "encoding/xml" "fmt" "strings" ) type Root struct { Things []Thing `xml:"thing"` } type Thing struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` } func main() { data := ` <root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root> ` thing := &Root{} err := xml.Unmarshal([]byte(strings.TrimSpace(data)), thing) if err != nil { fmt.Println(err) return } fmt.Println(thing) }</code>
Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal XML dengan Atribut dan Nilai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!