I have the following 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>
Now, I would unmarshal it into the golang struct such as:
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 parser detects true amount of tags,for instance, "a" in "card". But it doesn't detect values of these attributes. That is Printf output below after xml.Unmarshal:
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:""}}}}
What's wrong?
The fields in the client
and card
structs are private (have lowercase names), so the XML unmarshaler can't write to them. Change the names to start with an uppercase letter and they will work.
Also, unrelated, but you don't need the cards
struct just to get one tag deeper. If there's nothing else you need at that layer, you can put
Cards []card `xml:"card>a"`
into your OwCheckClient
struct and delete the cards
struct and it will deserialize properly.