我有以下 XML
<a>
<client client_id="6881937" clt_code="0" clt_date="" sms_block="N" active_serv="N" phone="77777645521" threshold_amount="1" clt_charge="" clt_charge_id="" > </client>
<card>
<a card_num="KZ5392...6449" card_id="66783573" crd_code="0" crd_date="" />
<a card_num="552204...9124" card_id="66783574" crd_code="0" crd_date="" />
<a card_num="KZ7392...4128" card_id="14335135" crd_code="0" crd_date="" />
<a card_num="440564...7683" card_id="14335136" crd_code="0" crd_date="" />
</card>
</a>
现在,我会将它解码到 golang 结构中,例如:
type OwCheckClient struct {
XMLName xml.Name `xml:"a"`
Client client `xml:"client"`
Cards cards `xml:"card"`
}
type client struct {
client_id string `xml:"client_id,attr"`
clt_code string `xml:"clt_code,attr"`
sms_block string `xml:"sms_block,attr"`
active_serv string `xml:"active_serv,attr"`
phone string `xml:"phone,attr"`
threshold_amount string `xml:"threshold_amount,attr"`
clt_charge string `xml:"clt_charge,attr"`
clt_charge_id string `xml:"clt_charge_id,attr"`
}
type cards struct {
Card []card `xml:"a"`
}
type card struct {
card_num string `xml:"card_num,attr"`
card_id string `xml:"card_id,attr"`
crd_code string `xml:"crd_code,attr"`
}
XML 解析器检测标签的真实数量,例如,“card”中的“a”。但它不检测这些属性的值。这是 xml.Unmarshal 之后的 Printf 输出:
v = &models.OwCheckClient{XMLName:xml.Name{Space:"", Local:"a"}, Client:models.client{client_id:"", clt_code:"", sms_block:"", active_serv:"", phone:"", threshold_amount:"", clt_charge:"", clt_charge_id:""}, Cards:models.cards{Card:[]models.card{models.card{card_num:"", card_id:"", crd_code:""}, models.card{card_num:"", card_id:"", crd_code:""}, models.card{card_num:"", card_id:"", crd_code:""}, models.card{card_num:"", card_id:"", crd_code:""}}}}
怎么了?
最佳答案
client
和 card
结构中的字段是私有(private)的(具有小写名称),因此 XML 解码器无法写入它们。将名称更改为以大写字母开头,它们将起作用。
此外,无关紧要,但您不需要 cards
结构来获得更深的标签。如果在那一层你不需要别的东西,你可以放
Cards []card `xml:"card>a"`
进入您的 OwCheckClient
结构并删除 cards
结构,它将正确反序列化。
关于GO 中的 XML 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49686061/