Golang XML Unmarshal和time.Time字段

时间:2013-06-25 15:16:10

标签: xml-parsing go unmarshalling

我有通过REST API检索的XML数据,我正在解组为GO结构。其中一个字段是日期字段,但API返回的日期格式与默认的time.Time解析格式不匹配,因此unmarshal失败。

有没有办法为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"`
}

返回的日期格式为“yyyymmdd”。

4 个答案:

答案 0 :(得分:50)

我遇到了同样的问题。

time.Time不满足xml.Unmarshaler接口。并且您无法指定日期格式。

如果你不想在之后处理解析而你更愿意让xml.encoding这样做,一个解决方案就是创建一个带有匿名time.Time字段的结构并实现你自己的UnmarshalXML 1}}使用您的自定义日期格式。

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

答案 1 :(得分:1)

根据我的阅读,encoding / xml有一些已知的问题,这些问题一直推迟到以后......

要解决此问题,请使用time.Time类型而不是使用string类型,然后再处理解析。

我在获取时间方面遇到了很多麻烦。请按以下格式使用日期:“星期五,2013年8月9日19:39:39 GMT”

奇怪的是,我发现“net / http”有一个ParseTime函数,它带有一个完美的字符串...... http://golang.org/pkg/net/http/#ParseTime

答案 2 :(得分:1)

我已经实现了符合规范的xml dateTime格式,您可以在GitHub上找到它:https://github.com/datainq/xml-date-time

您可以在W3C spec

中找到XML dateTime

答案 3 :(得分:-1)

const shortForm = "20060102" // yyyymmdd date format

这是不可读的。但它在Go中是正确的。您可以在http://golang.org/src/time/format.go

中阅读来源