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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將沒有根/父元素的 XML 轉(zhuǎn)換為結(jié)構(gòu)?

如何將沒有根/父元素的 XML 轉(zhuǎn)換為結(jié)構(gòu)?

Go
溫溫醬 2022-04-20 20:51:07
來自遠(yuǎn)程服務(wù)器的 API 響應(yīng)(響應(yīng)內(nèi)容類型:text/html):<status>success</status><statusmsg>online</statusmsg><vmstat>online</vmstat><hostname>kvm-vps2</hostname><ipaddress>123.456.789.99</ipaddress>我嘗試將上面的 API 響應(yīng)解析為 Go 結(jié)構(gòu)。我的以下方法均無效:方法 #1 代碼type result struct {    Status    string `xml:",chardata"`    Statusmsg string `xml:",chardata"`    Vmstat    string `xml:",chardata"`    Hostname  string `xml:",chardata"`    Ipaddress string `xml:",chardata"`}方法 #2 代碼type result struct {    Status    string `xml:"status"`    Statusmsg string `xml:"statusmsg"`    Vmstat    string `xml:"vmstat"`    Hostname  string `xml:"hostname"`    Ipaddress string `xml:"ipaddress"`}從方法 1 開始,我只設(shè)法獲得了Status價(jià)值。其他值為空。對(duì)于方法 #2,所有值都是空的。解組代碼:// other coder := result{}err = xml.Unmarshal(body, &r)// other code這里應(yīng)該修復(fù)什么以便我可以訪問所有 API 響應(yīng)值?
查看完整描述

1 回答

?
守著一只汪

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊

該響應(yīng)不是有效的 XML 文檔,因此您不能在一個(gè)步驟中按原樣解碼它,也不能不進(jìn)行修改/“裝飾”。


以下解決方案body用作未讀響應(yīng)正文流:Response.Body.


1. 解碼為一系列 XML 文檔

但是,它可以被視為一系列XML 文檔,因此您可以使用xml.Decoder它來逐個(gè)解碼它們。


例如:


var res result

dec := xml.NewDecoder(body)


var err error

decField := func(v interface{}) {

    if err == nil {

        err = dec.Decode(v)

    }

}

decField(&res.Status)

decField(&res.Statusmsg)

decField(&res.Vmstat)

decField(&res.Hostname)

decField(&res.Ipaddress)


if err != nil {

    fmt.Println(err)

}

fmt.Printf("%+v\n", res)

這個(gè)輸出(在Go Playground上試試):


{Status:success Statusmsg:online Vmstat:online Hostname:kvm-vps2 Ipaddress:123.456.789.99}

是的,逐場(chǎng)解碼很不方便。


2.讀取正文并用根標(biāo)簽包裝

另一種選擇是用標(biāo)簽包裝它以使其成為有效的 XML 文檔:


buf := &bytes.Buffer{}

buf.WriteString("<root>")

if _, err := io.Copy(buf, body); err != nil {

    panic(err)

}

buf.WriteString("</root>")


var res result

if err := xml.Unmarshal(buf.Bytes(), &res); err != nil {

    panic(err)

}


fmt.Printf("%+v\n", res)

這輸出相同。在Go Playground上嘗試一下。


是的,上述解決方案必須先將正文讀入內(nèi)存。


3. 包裹body流而不將其讀入內(nèi)存

不過,我們可以避免閱讀并將正文保存在內(nèi)存中。我們可以構(gòu)建一個(gè)閱讀器,它在閱讀時(shí)首先提供開始包裝標(biāo)簽,然后是“原始”正文,最后是結(jié)束標(biāo)簽。為此,我們可以使用io.MultiReader():


r := io.MultiReader(

    strings.NewReader("<root>"),

    body,

    strings.NewReader("</root>"),

)


var res result

if err := xml.NewDecoder(r).Decode(&res); err != nil {

    panic(err)

}


fmt.Printf("%+v\n", res)

這再次輸出相同的內(nèi)容。在Go Playground上試試這個(gè)。


查看完整回答
反對(duì) 回復(fù) 2022-04-20
  • 1 回答
  • 0 關(guān)注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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