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

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

在兩個命名空間中解組具有相同屬性名稱的 XML 屬性

在兩個命名空間中解組具有相同屬性名稱的 XML 屬性

Go
富國滬深 2022-05-05 16:10:27
我有一個 XML 結(jié)構(gòu),其中有一個未命名空間的“類型”屬性和一個命名空間屬性。我無法讓 GO 的解組器讀取兩個“類型”屬性。XML 是:data := `<response xmlns="urn:debugger_protocol_v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><map name="bool" type="bool_T" xsi:type="xsd:boolean"></map><map name="int" type="int_T" xsi:type="xsd:decimal"></map></response>`我的 Go/XML 定義是:type Typemap struct {    XMLName xml.Name `xml:"map"`    Name    string   `xml:"name,attr"`    Type    string   `xml:"urn:debugger_protocol_v1 type,attr"`    XsiType string   `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"`}type Response struct {    XMLName xml.Name `xml:"response"`    Typemap []Typemap `xml:"map,omitempty"`}運行以下代碼時:package mainimport (    "encoding/xml"    "fmt"    "strings")type Typemap struct {    XMLName xml.Name `xml:"map"`    Name    string   `xml:"name,attr"`    Type    string   `xml:"urn:debugger_protocol_v1 type,attr"`    XsiType string   `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"`}type Response struct {    XMLName xml.Name  `xml:"response"`    Typemap []Typemap `xml:"map,omitempty"`}func main() {    rq := new(Response)    data := `<response xmlns="urn:debugger_protocol_v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><map name="bool" type="bool_T" xsi:type="xsd:boolean"></map><map name="int" type="int_T" xsi:type="xsd:decimal"></map></response>`    reader := strings.NewReader(data)    decoder := xml.NewDecoder(reader)    err := decoder.Decode(&rq)    if err != nil {        fmt.Println(err)    }    fmt.Printf("Unmarshalled Content:\n%v", rq)}輸出漏掉了bool_T,如下:&{{urn:debugger_protocol_v1 response} [    {{urn:debugger_protocol_v1 map} bool  xsd:boolean}    {{urn:debugger_protocol_v1 map} int  xsd:decimal}]}如果我urn:debugger_protocol_v1從定義中刪除 ,我會收到以下錯誤:main.Typemap field "Type" with tag "type,attr" conflicts with field "XsiType" with tag "http://www.w3.org/2001/XMLSchema-instance type,attr"我無法更改原始 XML 數(shù)據(jù)格式。有沒有辦法解組這兩個type屬性?
查看完整描述

1 回答

?
米脂

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

事實證明,目前沒有辦法在 Go 中原生地做到這一點。有一個與命名空間相關(guān)的問題列表,以及描述它的特定問題,但尚未解決。


但是,我也找到了一種解決方法??梢詾閷傩院驮鼐帉懽约旱慕饨M代碼。


對于屬性,您可以實現(xiàn)以下內(nèi)容:


type NonMarshalled string


func (s *NonMarshalled) UnmarshalXMLAttr(attr xml.Attr) error {

    fmt.Printf("Parsing attribute '%s', with value '%s'", attr.Name.Local, attr.Value)

    s.Title = strings.ToUpper(attr.Value)

    return nil

}


type Typemap struct {

    XMLName xml.Name `xml:"map"`

    Name    string   `xml:"name,attr"`

    Type    NonNamespaced `xml:"type,attr"`

    XsiType string   `xml:"http://www.w3.org/2001/XMLSchema-instance type,attr"`

}

但是,這并不能同時具有命名空間屬性名稱和具有相同名稱的非命名空間屬性。這仍然會導(dǎo)致:


main.Typemap field "Type" with tag "type,attr" conflicts with field "XsiType" with tag "http://www.w3.org/2001/XMLSchema-instance type,attr"

這里的解決方法是為整個Typemap類型編寫一個解組器。就我而言,此代碼如下所示:


func (s *Typemap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {                                         

    nameAttr := ""                                                                                                     

    typeAttr := ""                                                                                                     

    xsiTypeAttr := ""                                                                                                  


    for _, attr := range start.Attr {                                                                                  

        if attr.Name.Space == "" && attr.Name.Local == "name" {                                                        

            nameAttr = attr.Value                                                                                      

        }                                                                                                              

        if attr.Name.Space == "" && attr.Name.Local == "type" {                                                        

            typeAttr = attr.Value                                                                                      

        }                                                                                                              

        if attr.Name.Space == "http://www.w3.org/2001/XMLSchema-instance" && attr.Name.Local == "type" {               

            xsiTypeAttr = attr.Value                                                                                   

        }                                                                                                              

    }                                                                                                                  


    d.Skip()                                                                                                           

    *s = Typemap{Name: nameAttr, Type: typeAttr, XsiType: xsiTypeAttr}                                                 


    return nil                                                                                                         

}                      


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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