Go unmarshal xml into struct

huangapple go评论119阅读模式
英文:

Go unmarshal xml into struct

问题

我有这个xml文件,似乎无法将任何数据解组到结构体中。有人可以在这里帮助我吗?我以前从未使用过xml,总是更喜欢json。我刚刚用我的代码编辑了这篇帖子,但它仍然给我空的结构体值。

  1. <Envelope>
  2. <Data>
  3. <Order>
  4. <DeliveryData>
  5. <del_country>BELGIQUE/BELGIE</del_country>
  6. <del_country_code>BE</del_country_code>
  7. <del_company>False</del_company>
  8. <del_name>ADAM</del_name>
  9. <del_contact></del_contact>
  10. <del_firstName></del_firstName>
  11. <del_addressLine1>Durasweg 33</del_addressLine1>
  12. <del_addressLine2></del_addressLine2>
  13. <del_areaCode>1000</del_areaCode>
  14. <del_city>BRUXELLES</del_city>
  15. <del_country>BE</del_country>
  16. <del_language>FR</del_language>
  17. <del_modeCode>71</del_modeCode>
  18. <phone1>0032872180808</phone1>
  19. <email></email>
  20. <inv_third>438802</inv_third>
  21. <OrderID>15787978</OrderID>
  22. <ParcelID>NE1578797801</ParcelID>
  23. <OrderDate>16/09/2014 14:22:54</OrderDate>
  24. <Shipping_date>16/09/2014 14:26:55</Shipping_date>
  25. </DeliveryData>
  26. </Order>
  27. </Data>
  28. </Envelope>
  1. type DeliveryData struct {
  2. XMLName xml.Name `xml:"DeliveryData"`
  3. Country string `xml:"del_country"`
  4. }
  5. type Envelope struct {
  6. XMLName xml.Name `xml:"Envelope"`
  7. Data Data `xml:"Data"`
  8. }
  9. type Data struct {
  10. XMLName xml.Name `xml:"Data"`
  11. Orders []Order `xml:"Order"`
  12. }
  13. type Order struct {
  14. XMLName xml.Name `xml:"Order"`
  15. DeliveryData DeliveryData `xml:"DeliveryData"`
  16. }
英文:

I have this xml file and i it seems i cant unmarshal any data into a struct. Someone can help me out here. Its just i never used xml before, always prefered json before xml. Just edited this post with my code and it still gives me empty struct values

  1. &lt;Envelope&gt;
  2. &lt;Data&gt;
  3. &lt;Order&gt;
  4. &lt;DeliveryData&gt;
  5. &lt;del_country&gt;BELGIQUE/BELGIE&lt;/del_country&gt;
  6. &lt;del_country_code&gt;BE&lt;/del_country_code&gt;
  7. &lt;del_company&gt;False&lt;/del_company&gt;
  8. &lt;del_name&gt;ADAM&lt;/del_name&gt;
  9. &lt;del_contact&gt;&lt;/del_contact&gt;
  10. &lt;del_firstName&gt;&lt;/del_firstName&gt;
  11. &lt;del_addressLine1&gt;Durasweg 33&lt;/del_addressLine1&gt;
  12. &lt;del_addressLine2&gt;&lt;/del_addressLine2&gt;
  13. &lt;del_areaCode&gt;1000&lt;/del_areaCode&gt;
  14. &lt;del_city&gt;BRUXELLES&lt;/del_city&gt;
  15. &lt;del_country&gt;BE&lt;/del_country&gt;
  16. &lt;del_language&gt;FR&lt;/del_language&gt;
  17. &lt;del_modeCode&gt;71&lt;/del_modeCode&gt;
  18. &lt;phone1&gt;0032872180808&lt;/phone1&gt;
  19. &lt;email&gt;&lt;/email&gt;
  20. &lt;inv_third&gt;438802&lt;/inv_third&gt;
  21. &lt;OrderID&gt;15787978&lt;/OrderID&gt;
  22. &lt;ParcelID&gt;NE1578797801&lt;/ParcelID&gt;
  23. &lt;OrderDate&gt;16/09/2014 14:22:54&lt;/OrderDate&gt;
  24. &lt;Shipping_date&gt;16/09/2014 14:26:55&lt;/Shipping_date&gt;
  25. &lt;/DeliveryData&gt;
  26. &lt;/Order&gt;
  27. &lt;/Data&gt;

</Envelope>

  1. type DeliveryData struct {
  2. XMLName xml.Name `xml:&quot;DeliveryData&quot;`
  3. Country string `xml:&quot;del_country&quot;`
  4. }
  5. type Envelope struct {
  6. XMLName xml.Name `xml:&quot;Envelope&quot;`
  7. Data Data `xml:&quot;Data&quot;`
  8. }
  9. type Data struct {
  10. XMLName xml.Name `xml:Data`
  11. Orders []Order `xml:Order`
  12. }
  13. type Order struct {
  14. XMLName xml.Name `xml:&quot;Order&quot;`
  15. DeliveryData DeliveryData `xml:&quot;DeliveryData&quot;`
  16. }

答案1

得分: 7

有两个原因:

  1. 你的 XML 格式不正确 - 你应该添加一个闭合的 &lt;/Envelope&gt;
  2. 你在 Data 结构体标签中的格式不正确 - 它们没有引用属性的名称 - 这意味着 XML 反序列化器会寻找一个名为 'Order' 的字段,而不是 Orders 字段。

为了确保正确:你可以在 http://play.golang.org/p/6-odOcSOnF 找到一个完整可工作的示例。

相关部分是我的

  1. type Data struct {
  2. XMLName xml.Name `xml:&quot;Data&quot;`
  3. Orders []Order `xml:&quot;Order&quot;`
  4. }

与你原来的

  1. type Data struct {
  2. XMLName xml.Name `xml:Data`
  3. Orders []Order `xml:Order`
  4. }
英文:

There are two reasons:

  1. Your XML is malformed - you should add a closing &lt;/Envelope&gt;.
  2. Your struct tags in Data are malformed – they don't quote the name of the attribute - this means the the XML deserializer looks for an 'Order' field, instead of the Orders field.

For good measure: you can find a fully working example on http://play.golang.org/p/6-odOcSOnF

The relevant part is my

  1. type Data struct {
  2. XMLName xml.Name `xml:&quot;Data&quot;`
  3. Orders []Order `xml:&quot;Order&quot;`
  4. }

versus your original

  1. type Data struct {
  2. XMLName xml.Name `xml:Data`
  3. Orders []Order `xml:Order`
  4. }

答案2

得分: 0

根据@publysher的回答,你实际上不需要那么多的结构体,只需要两个:

  1. type Data struct {
  2. XMLName xml.Name `xml:"Envelope"`
  3. Data []Fields `xml:"Data>Order>DeliveryData"`
  4. }
  5. type Fields struct {
  6. Country string `xml:"del_country"`
  7. OrderID uint64
  8. }

然后你可以解析你的XML(在你修复它之后,就像@publysher指出的那样):

  1. var data Data
  2. err := xml.Unmarshal([]byte(serialized), &data)
  3. if err != nil {
  4. fmt.Println(err)
  5. return
  6. }
英文:

Adding to @publysher's answer, you don't actually need to have so many structs, you just need 2:

  1. type Data struct {
  2. XMLName xml.Name `xml:&quot;Envelope&quot;`
  3. Data []Fields `xml:&quot;Data&gt;Order&gt;DeliveryData&quot;`
  4. }
  5. type Fields struct {
  6. Country string `xml:&quot;del_country&quot;`
  7. OrderID uint64
  8. }

then you can unmarshal your xml (after you fix it of course like @publysher pointed out):

  1. var data Data
  2. err := xml.Unmarshal([]byte(serialized), &amp;data)
  3. if err != nil {
  4. fmt.Println(err)
  5. return
  6. }

huangapple
  • 本文由 发表于 2014年10月13日 16:21:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/26335607.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定