将XML转换为结构体的Go解组技术

4

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

<Envelope>
<Data>
        <Order>
            <DeliveryData>
                <del_country>BELGIQUE/BELGIE</del_country>
                <del_country_code>BE</del_country_code>
                <del_company>False</del_company>
                <del_name>ADAM</del_name>
                <del_contact></del_contact>
                <del_firstName></del_firstName>
                <del_addressLine1>Durasweg 33</del_addressLine1>
                <del_addressLine2></del_addressLine2>
                <del_areaCode>1000</del_areaCode>
                <del_city>BRUXELLES</del_city>
                <del_country>BE</del_country>
                <del_language>FR</del_language>
                <del_modeCode>71</del_modeCode>
                <phone1>0032872180808</phone1> 
                <email></email>
                <inv_third>438802</inv_third>
                <OrderID>15787978</OrderID>
                <ParcelID>NE1578797801</ParcelID>
                <OrderDate>16/09/2014 14:22:54</OrderDate>
                <Shipping_date>16/09/2014 14:26:55</Shipping_date>
            </DeliveryData>
    </Order>
  </Data>

 type DeliveryData struct {
    XMLName xml.Name `xml:"DeliveryData"`
    Country string   `xml:"del_country"`
}

type Envelope struct {
    XMLName xml.Name `xml:"Envelope"`
    Data    Data     `xml:"Data"`
}

type Data struct {
    XMLName xml.Name `xml:Data`
    Orders  []Order  `xml:Order`
}

type Order struct {
    XMLName      xml.Name     `xml:"Order"`
    DeliveryData DeliveryData `xml:"DeliveryData"`
}

1
你的XML无效 - 你用 </data> 关闭了 <Data>,但没有关闭 <Envelope>。这是在原始代码中还是只是你在这里粘贴时出现的问题? - Not_a_Golfer
1
另外,请粘贴尝试反序列化XML的代码,也许其中有一些微不足道的错误。 - Not_a_Golfer
2个回答

7
有两个原因:
  1. 您的XML格式不正确 - 您应该添加一个关闭标签 </Envelope>
  2. Data 中的 struct 标签格式不正确 - 它们没有引用属性名称 - 这意味着 XML 反序列化程序查找 'Order' 字段,而不是 Orders 字段。
为了保险起见:您可以在http://play.golang.org/p/6-odOcSOnF上找到一个完全可行的示例。
相关部分是我的
type Data struct {
    XMLName xml.Name `xml:"Data"`
    Orders  []Order  `xml:"Order"`
}

与您的原始版本相比

type Data struct {
    XMLName xml.Name `xml:Data`
    Orders  []Order  `xml:Order`
}

这是正确的答案,我的只是额外的信息。 - OneOfOne

0

补充@publysher的答案,实际上你不需要有那么多结构体,你只需要两个:

type Data struct {
    XMLName xml.Name       `xml:"Envelope"`
    Data  []Fields `xml:"Data>Order>DeliveryData"`
}

type Fields struct {
    Country string   `xml:"del_country"`
    OrderID uint64
}

然后你可以反序列化你的xml(在你修复它之后,当然像@publysher指出的那样):

var data Data
err := xml.Unmarshal([]byte(serialized), &data)
if err != nil {
    fmt.Println(err)
    return
}

但是,在将其取消编组后,如何向结构添加新订单?您能举个例子吗? - Rogier Lommers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接