2013-06-25 15 views
11

XMLデータがあります。REST APIを使用して取得していますが、GO構造体にマーマーリングしていません。フィールドの1つは日付フィールドですが、APIによって返される日付フォーマットはデフォルトのtime.Time解析フォーマットと一致せず、したがって非整列化は失敗します。Golang XML非整列化と時刻。時間フィールド

時間内に使用する日付書式を非整列化関数に指定する方法はありますか。タイム解析ですか?私は適切に定義された型を使用し、datetimeフィールドを保持する文字列を使用したいと思います。

サンプル構造体:

type Transaction struct { 

    Id int64 `xml:"sequencenumber"` 
    ReferenceNumber string `xml:"ourref"` 
    Description string `xml:"description"` 
    Type string `xml:"type"` 
    CustomerID string `xml:"namecode"` 
    DateEntered time.Time `xml:"enterdate"` //this is the field in question 
    Gross float64 `xml:"gross"` 
    Container TransactionDetailContainer `xml:"subfile"` 
} 

返される日付形式は "YYYYMMDD" です。代わりに、タイプtime.Time使用stringを使用するのでは、この問題を回避し、処理するには、私はエンコード/ XMLは後日まで延期されているいくつかの既知の問題を持って読んだものから、

+0

でXMLのdateTimeを見つけることができ、マーシャリングだけを扱っています。 https://groups.google.com/forum/#!topic/golang-nuts/IM3ZIcYXbz4 – Intermernet

+0

また、https://code.google.com/p/go/issues/detail?id=2771 – Intermernet

答えて

40

私は同じ問題がありました。

time.Timeは、xml.Unmarshalerインターフェイスを満たしていません。日付を指定することはできません。

あなたはその後の解析を処理したくないとあなたはxml.encodingがそれをやらせることを好む場合は、1つの解決策は、匿名time.Timeフィールドを持つ構造体を作成し、カスタム日付形式を使用して独自のUnmarshalXMLを実装することです。

type Transaction struct { 
    //... 
    DateEntered  customTime  `xml:"enterdate"` // use your own type that satisfies UnmarshalXML 
    //... 
} 

type customTime struct { 
    time.Time 
} 

func (c *customTime) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    const shortForm = "20060102" // yyyymmdd date format 
    var v string 
    d.DecodeElement(&v, &start) 
    parse, err := time.Parse(shortForm, v) 
    if err != nil { 
     return err 
    } 
    *c = customTime{parse} 
    return nil 
} 

XMLエレメントが日付として属性を使用する場合、同じ方法でUnmarshalXMLAttrを実装する必要があります。

はそれが読めないhttp://play.golang.org/p/EFXZNsjE4a

+0

これは私を正しい道に導きました。 'customTime time.Time'を代わりに使ったときの対処はさらに簡単でした。基本的な' time.Time'をstruct要素として扱う必要はありません。 – Colselaw

+1

DecodeElementがエラーを返すことに注意してください。これは、nilでない場合にチェックして返す必要があります。 – AndreiM

1

...

後で解析する。

私はtime.Parseは、次の形式で日付で動作するようになってトラブルのかなりのビットを持っていた:「金、2013年8月9日19時39分39秒GMT」

を奇妙なことに、私はネット/ HTTP」ことがわかりました"完全に機能している文字列を受け取るParseTime関数を持っています... http://golang.org/pkg/net/http/#ParseTime

+0

をご覧ください。私が日付フィールドの型を文字列に設定するとすぐに、最も奇妙なことです。解析が開始されました.... –

-1
const shortForm = "20060102" // yyyymmdd date format 

を参照してください。しかし、それは正しいです。あなたはGitHubの上でそれを見つけることができ、http://golang.org/src/time/format.go

関連する問題