在 Go 中使用屬性和值解組 XML 元素
XML 元素通常同時包含屬性和值。要成功將此類元素解組到 Golang 結構中,必須了解 XMLName 和「,chardata」註解的作用。
定義不含XMLName 的結構
考慮提供的XML:
<code class="xml"><thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing></code>
沒有XMLName 欄位的對應結構可以是:
<code class="go">type ThingElem struct { Prop int `xml:"prop,attr"` Value float64 `xml:",chardata"` }</code>
理解 XMLName
XMLName 可用來明確定義結構的 XML 標記名稱。在我們的例子中,XML 標籤名稱是推斷出來的,因為它與結構名稱 (ThingElem) 相符。因此,在此場景中不需要 XMLName。使用包裝器結構
如果 XML 結構更複雜或可能不明確,您可以使用包裝器結構提供額外的背景資訊。例如,如果 XML 在根元素中包含多個 thing 元素:<code class="xml"><root> <thing prop="1"> 1.23 </thing> <thing prop="2"> 4.56 </thing> </root></code>
<code class="go">type ThingWrapper struct { T ThingElem `xml:"thing"` }</code>
解組注意事項
對於提供的 XML 數據,您需要考慮元素值中的空格。由於 XML 預設不會保留空格,因此應修剪這些值,或可使用 xml:",innerxml" 註解。 結果結構可以如下解組:<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>
以上是如何在 Go 中使用屬性和值解組 XML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!