1 回答

TA貢獻1893條經驗 獲得超10個贊
不幸的是,無法使用默認的 XML 解組器通過僅使用結構字段標簽來實現您的目標,因此您必須:
為具有“ref”字段的“Members”字段提取結構類型(類似于“Info”類型)。
為“Member”使用自定義類型,它是一個字符串,
xml.Unmarshaler
通過從關聯的 XML 元素中提取“ref”屬性的值來實現。
以下是如何實施上述策略 #2 (?Go Playground?) 的示例:
type Group struct {
? Id? ? ? string? ? ? `xml:"id,attr"`
? Members []MemberRef `xml:"member"`
? Info? ? []Info? ? ? `xml:"info"`
}
type MemberRef string
func (m *MemberRef) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
? *m = MemberRef(start.Attr[0].Value) // Assume only the "ref" attribute exists.
? _, err := d.Token() // Consume and discard the synthetic xml.EndElement.
? return err
}
// ...
var group Group
err := xml.Unmarshal([]byte(xmlstr), &group)
if err != nil {
? ? panic(err)
}
fmt.Printf("%#v\n", group)
// main.Group{Id:"26659127", Members:[]main.MemberRef{"292403538", "298884289", "261728686"}, Info:...
請注意,您甚至可以將此結構直接編組為您列出的示例 JSON 格式:
bs, err := json.MarshalIndent(group, "", "? ")
if err != nil {
? ? panic(err)
}
fmt.Println(string(bs))
// {
//? ?"Id": "26659127",
//? ?"Members": [
//? ? ?"292403538",
//? ? ?"298884289",
//? ? ?"261728686"
//? ?],
//? ?"Info": [
//? ? ?...
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報