第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

將 XML 解析為包含切片的結(jié)構(gòu)

將 XML 解析為包含切片的結(jié)構(gòu)

Go
慕仙森 2023-03-29 17:09:04
情況:我有這個 XML 結(jié)構(gòu):<group id="26659127">    <member ref="292403538"/>    <member ref="298884289"/>    <member ref="261728686"/>    <info k="name" v="omega"/>    <info k="rank" v="16"/></group>我需要將這個 XML 轉(zhuǎn)換成這個結(jié)構(gòu):{    Id: "26659127",    Members: ["26659127", "298884289", "261728686"],    Info: [        {            Key: "name",            Value: "omega"        },        {            Key: "rank",            Value: "16"        }    ]}問題:我已經(jīng)創(chuàng)建了一個用于解析 XML 的結(jié)構(gòu):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"放在這里,但是沒有用。問題:有沒有可能解決這個問題?如果是,我應(yīng)該使用什么表達方式?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻1893條經(jīng)驗 獲得超10個贊

不幸的是,無法使用默認(rèn)的 XML 解組器通過僅使用結(jié)構(gòu)字段標(biāo)簽來實現(xiàn)您的目標(biāo),因此您必須:

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

  2. 為“Member”使用自定義類型,它是一個字符串,xml.Unmarshaler通過從關(guān)聯(lián)的 XML 元素中提取“ref”屬性的值來實現(xiàn)。

以下是如何實施上述策略 #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:...

請注意,您甚至可以將此結(jié)構(gòu)直接編組為您列出的示例 JSON 格式:


bs, err := json.MarshalIndent(group, "", "? ")

if err != nil {

? ? panic(err)

}

fmt.Println(string(bs))

// {

//? ?"Id": "26659127",

//? ?"Members": [

//? ? ?"292403538",

//? ? ?"298884289",

//? ? ?"261728686"

//? ?],

//? ?"Info": [

//? ? ?...


查看完整回答
反對 回復(fù) 2023-03-29
  • 1 回答
  • 0 關(guān)注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號