7

次の 2 つの XML ドキュメントを検討してください

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

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

bGo to a struct field of typeで、最初のケースでエラーを発生さintせずに、この XML を適切に非整列化するにはどうすればよいですか?strconv.ParseInt: parsing "": invalid syntax

omitemptyこの場合はうまくいかないようです。

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

4

2 に答える 2

1

omitempty タグは、Unmarshal ではなく Marshal で尊重されます。

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 に答える