7

考虑这 2 个 XML 文档

<a>
  <b nil="true"></b>
</a>

<a>
  <b type="integer">1</b>
</a>

如何在 Go to a bstruct field of type中正确解组此 XML,而不会在第一种情况int下产生错误?strconv.ParseInt: parsing "": invalid syntax

omitempty在这种情况下似乎不起作用。

示例:http ://play.golang.org/p/fbhVJ4zUbl

4

2 回答 2

1

omitempty 标签只是尊重 Marshal,而不是 Unmarshal。

如果 int 值不是实际的 int,则解组错误。

相反,将 B 更改为字符串。然后,使用 strconv 包将 B 转换为 int。如果出错,将其设置为 0。

试试这个片段:http ://play.golang.org/p/1zqmlmIQDB

于 2013-07-10T19:39:33.197 回答
0

您可以使用“github.com/guregu/null”包。它有助于:

package main
import (
"fmt"
    "encoding/xml"
    "github.com/guregu/null"
)

type Items struct{
    It []Item `xml:"Item"`
}

type Item struct {
    DealNo   string
    ItemNo   null.Int
    Name     string
    Price    null.Float
    Quantity null.Float
    Place    string
}

func main(){
    data := `
    <Items>
        <Item>
                <DealNo/>
                <ItemNo>32435</ItemNo>
                <Name>dsffdf</Name>
                <Price>135.12</Price>
                <Quantity></Quantity>
                <Place>dsffs</Place>
            </Item>
            <Item>
                <DealNo/>
                <ItemNo></ItemNo>
                <Name>dsfsfs</Name>
                <Price></Price>
                <Quantity>1.5</Quantity>
                <Place>sfsfsfs</Place>
            </Item>
            </Items>`

var xmlMsg Items

        if err := xml.Unmarshal([]byte(data), &xmlMsg); err != nil {
        fmt.Println("Error: cannot unmarshal xml from web ", err)
        } else {
            fmt.Println("XML: ", xmlMsg)
        }
}
于 2017-02-13T11:17:15.370 回答