22

GO 構造体にアンマーシャリングしている REST API を介して取得している XML データがあります。フィールドの 1 つが日付フィールドですが、API によって返される日付形式がデフォルトの time.Time 解析形式と一致しないため、非整列化が失敗します。

time.Time 解析で使用する日付形式を unmarshal 関数に指定する方法はありますか? 適切に定義された型を使用したいのですが、文字列を使用して日時フィールドを保持するのは間違っていると感じています。

サンプル構造体:

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」です。

4

4 に答える 4

59

私も同じ問題を抱えていました。

time.Timexml.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を参照

于 2014-07-29T12:24:27.560 に答える
2

私が読んだことから、エンコーディング/xmlには、後日まで延期されたいくつかの既知の問題があります...

この問題を回避するには、型をtime.Time使用する代わりに、string後で解析を処理します。

時間を取得するのにかなり苦労しました。次の形式の日付を処理するための解析: "Fri, 09 Aug 2013 19:39:39 GMT"

奇妙なことに、「net/http」には、完全に機能する文字列を取る ParseTime 関数があることがわかりました... http://golang.org/pkg/net/http/#ParseTime

于 2013-08-16T06:41:22.200 に答える