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

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

如何編組和解組具有不規則屬性的 XML

如何編組和解組具有不規則屬性的 XML

Go
30秒到達戰場 2022-05-05 16:08:54
我有一個 XML,其中不同的實體用相同的標簽表示但具有不同的屬性。像這樣的東西:<xml>    <body>        <Packet type="clients">            <Row id="123" name="bill"/>            <Row id="456" name="sasha"/>        </Packet>        <Packet type="orders">            <Row sum="90" status="DONE" />            <Row sum="190" status="DONE" />       </Packet>   </body></xml>保證每種類型只有一個數據包。不幸的是,改變 XML 的結構不是我的責任,我必須照原樣處理它。在 Go 中處理這種結構的最佳方法是什么?我是否應該擁有一個具有所有可能屬性的結構,并為每個“數據包”填充正確的結構?type XML struct {    XMLName xml.Name `xml:"xml"`    Body    struct {        Packet []struct {            Type string `xml:"type,attr"`            Row  []struct {                ID     string `xml:"id,attr"`                Name   string `xml:"name,attr"`                Sum    string `xml:"sum,attr"`                Status string `xml:"status,attr"`            } `xml:"Row"`        } `xml:"Packet"`    } `xml:"body"`} 這似乎可行,但很不方便,因為實際上我有許多不同類型的數據包,它們具有不同的屬性?;蛘咭苍S有辦法將數據包映射到不同的 Go 結構?像這樣的東西:type XML struct {    XMLName xml.Name `xml:"xml"`    Body    struct {        ClientPacket struct {            Type string `xml:"type,attr"`            Row  []struct {                ID   string `xml:"id,attr"`                Name string `xml:"name,attr"`            } `xml:"Row"`         } `xml:"Packet"` // ???        OrderPacket struct {            Type string `xml:"type,attr"`            Row  []struct {                Sum   string `xml:"sum,attr"`                Status string `xml:"status,attr"`            } `xml:"Row"`         } `xml:"Packet"` // ???    } `xml:"body"`} 后者似乎更聰明,更易讀的例子,但我不明白如何用它來編組和解組 xml。
查看完整描述

2 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

在編組之前先轉換文件(例如使用 XSLT)。



查看完整回答
反對 回復 2022-05-05
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

我可以想到幾種方法可以實現這一點:您可以嘗試已經描述的方法,使用包含所有可能屬性的結構。這會很乏味但很容易。您還可以嘗試為以下內容編寫自定義解組器Packet:


type PacketXML struct {

   A *PacketTypeA

   B *PacketTypeB

   ...

}


func (x *PacketXML)  UnmarshalXML(d *Decoder, start StartElement) error {

    // Look at start attributes, find out what type of packet it has

    packetType:=findAttr(start,"type")

    switch packetType {

      case "typeA":

         x.A=&PacketTypeA{}

         return d.Decode(x.A)

      case "typeB":

         x.B=&PacketTypeB{}

         return d.Decode(x.B)

      ...

    }

  return nil

}

一切完成后,您可以檢查PacketXML實例的哪些元素是非空的,并使用它。


查看完整回答
反對 回復 2022-05-05
  • 2 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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