亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 XML 解析為包含切片的結構

將 XML 解析為包含切片的結構

Go
慕仙森 2023-03-29 17:09:04
情況:我有這個 XML 結構:<group id="26659127">    <member ref="292403538"/>    <member ref="298884289"/>    <member ref="261728686"/>    <info k="name" v="omega"/>    <info k="rank" v="16"/></group>我需要將這個 XML 轉換成這個結構:{    Id: "26659127",    Members: ["26659127", "298884289", "261728686"],    Info: [        {            Key: "name",            Value: "omega"        },        {            Key: "rank",            Value: "16"        }    ]}問題:我已經創建了一個用于解析 XML 的結構:type Group struct {    Id      string   `xml:"id,attr"`    Members []string `xml:" "`    Info    []Info   `xml:"info"`}type Info struct {    Key     string   `xml:"k,attr"`    Value   string   `xml:"v,attr"`}但是,如您所見,我還沒有定義表達式Members。實際上,我試過把xml:"member,ref,attr"和xml:"member:ref,attr"放在這里,但是沒有用。問題:有沒有可能解決這個問題?如果是,我應該使用什么表達方式?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

不幸的是,無法使用默認的 XML 解組器通過僅使用結構字段標簽來實現您的目標,因此您必須:

  1. 為具有“ref”字段的“Members”字段提取結構類型(類似于“Info”類型)。

  2. 為“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": [

//? ? ?...


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號