我有一個 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 回答

烙印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實例的哪些元素是非空的,并使用它。
- 2 回答
- 0 關注
- 145 瀏覽
添加回答
舉報
0/150
提交
取消