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

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

如何在 GO 中解組動(dòng)態(tài) XML

如何在 GO 中解組動(dòng)態(tài) XML

Go
慕容3067478 2023-06-26 18:07:24
我嘗試使用 Go 解析 XML,它用于與另一個(gè)系統(tǒng)交換數(shù)據(jù)。我知道原則上如何使用 xml.Unmarshal 函數(shù)進(jìn)行解析。但是,在協(xié)議中,根元素的子元素<PROTO>有所不同(請(qǐng)參見(jiàn)下面的示例)。對(duì)于子元素(REQUEST.DATA、REQUEST.ACL、REQUEST.NAC、 ... - 超過(guò)二十種不同的),xml:...到目前為止我已經(jīng)使用 -syntax 定義了結(jié)構(gòu) - 這些單個(gè)子元素的解析有效。但是,是否有一種好方法將整個(gè)消息解析為結(jié)構(gòu),其中一個(gè)變量類型取決于子元素?例如使用接口?可能的 XML 消息示例:<PROTO   version="1.00">  <REQUEST.DATA>    <DATA-L>Some information</DATA-L>  </REQUEST.DATA></PROTO><PROTO   version="1.00">  <REQUEST.ACK>    <ACK-ID>1</ACK-ID>  <REQUEST.ACK></PROTO>我的 Go 應(yīng)用程序的片段:// XML: REQUEST.DATAtype DataRequest struct {    LData string `xml:"DATA-L"`}// XML: REQUEST.ACKtype AckRequest struct {    AckId int `xml:"ACK-ID"`}// XML: PROTO  <============= ??type Request struct {    Version float32  `xml:"version,attr"`    RemoteRequest {AckRequest, DataRequest, ...} ????}func main() {    message := `<PROTO version="1.00"><REQUEST.ACK><ACK-ID>1</ACK-ID><REQUEST.ACK></PROTO>`    data := `<REQUEST.ACK><ACK-ID>1</ACK-ID><REQUEST.ACK>`    doc := &AckRequest{}    err := xml.Unmarshal([]byte(data), &doc)    if err != nil {        fmt.Printf("error: %v", err)        return    }    fmt.Printf("data %+v", doc)}我不想只解析子元素,而是data想解析整個(gè)文檔message(<PROTO>涉及)。并且想要有一個(gè)包含各個(gè)子元素信息的結(jié)構(gòu)。
查看完整描述

1 回答

?
千巷貓影

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

您可以將DataRequest和AckRequest作為指針嵌入到Request結(jié)構(gòu)中。這樣您可以稍后檢查它們是否存在nil。


// XML: REQUEST.DATA

type DataRequest struct {

    LData string `xml:"DATA-L"`

}


// XML: REQUEST.ACK

type AckRequest struct {

    AckId int `xml:"ACK-ID"`

}


type Request struct {

    Version float32      `xml:"version,attr"`

    Ack     *AckRequest  `xml:"REQUEST.ACK"`

    Data    *DataRequest `xml:"REQUEST.DATA"`

}


func main() {

    message := `<PROTO version="1.00"><REQUEST.ACK><ACK-ID>1</ACK-ID></REQUEST.ACK></PROTO>`

    proto := &Request{}

    err := xml.Unmarshal([]byte(message), &proto)

    if err != nil {

        fmt.Printf("error: %v", err)

        return

    }

    // if proto.Ack == nil {

    //   fmt.Println("Ack is nil")

    // }

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

    fmt.Printf("data %+v\n", proto.Ack)

}

數(shù)據(jù)&{版本:1 確認(rèn):0xc0000b6050 數(shù)據(jù):}


數(shù)據(jù) &{AckId:1}


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

添加回答

舉報(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)