2013-06-25 29 views
11

我有我通過REST API檢索到的XML數據,我正在解組成GO結構。其中一個字段是日期字段,但由API返回的日期格式與默認time.Time解析格式不匹配,因此解組失敗。Golang XML解組和時間。時間字段

有沒有什麼辦法可以指定unmarshal函數在time.Time解析中使用哪種日期格式?我想使用正確定義的類型並使用字符串來保存日期時間字段感覺不對。

樣品的結構:

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"` 
} 

日期格式返回的 「年月日」。

+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做到這一點,一個解決方案是創建一個結構與匿名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元素使用attribut作爲日期,則必須以相同的方式實現UnmarshalXMLAttr。

http://play.golang.org/p/EFXZNsjE4a

+0

這讓我失去了正確的道路。當我做'customTime time.Time'時,處理起來更容易 - 不需要將底層的'time.Time'作爲一個struct元素來處理。 – Colselaw

+1

注意DecodeElement返回一個錯誤,如果不是零,應該檢查並返回錯誤。 – AndreiM

1

從我讀過的編碼/ XML有已經推遲到以後一些已知的問題...

爲了解決這個問題,而不是使用類型time.Time使用string和處理之後解析。

我有相當多的麻煩time.Parse與下面的日期格式的工作:「星期五,2013年8月9日19點39分39秒GMT」

奇怪的是我發現,「網/ HTTP 「有一個ParseTime函數,需要一個完美的工作字符串... http://golang.org/pkg/net/http/#ParseTime

+0

奇怪的是,只要我設置日期字段的類型,以字符串的一切開始分析...... –