考虑这 2 个 XML 文档
<a>
<b nil="true"></b>
</a>
和
<a>
<b type="integer">1</b>
</a>
如何在 Go to a b
struct field of type中正确解组此 XML,而不会在第一种情况int
下产生错误?strconv.ParseInt: parsing "": invalid syntax
omitempty
在这种情况下似乎不起作用。
考虑这 2 个 XML 文档
<a>
<b nil="true"></b>
</a>
和
<a>
<b type="integer">1</b>
</a>
如何在 Go to a b
struct field of type中正确解组此 XML,而不会在第一种情况int
下产生错误?strconv.ParseInt: parsing "": invalid syntax
omitempty
在这种情况下似乎不起作用。
omitempty 标签只是尊重 Marshal,而不是 Unmarshal。
如果 int 值不是实际的 int,则解组错误。
相反,将 B 更改为字符串。然后,使用 strconv 包将 B 转换为 int。如果出错,将其设置为 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)
}
}