2013-06-25 15:16
浏览 262

Golang XML Unmarshal和time.Time字段

I have XML data I am retrieving via a REST API that I am unmarshal-ing into a GO struct. One of the fields is a date field, however the date format returned by the API does not match the default time.Time parse format and thus the unmarshal fails.

Is there any way to specify to the unmarshal function which date format to use in the time.Time parsing? I'd like to use properly defined types and using a string to hold a datetime field feels wrong.

Sample struct:

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

The date format returned is "yyyymmdd".

图片转代码服务由CSDN问答提供 功能建议

我有要通过REST API检索的XML数据,我正在将其解组为GO结构。 字段之一是日期字段,但是API返回的日期格式与默认时间不匹配。时间解析格式导致取消编组失败。

有什么方法可以指定 到解组函数中,在时间中使用哪种日期格式。时间解析? 我想使用正确定义的类型,并使用字符串来保存日期时间字段。


  type 交易结构{
 ID int64`xml:“ sequencenumber”`
 ReferenceNumber字符串`xml:“ ourref”`
描述字符串`xml:“ description”`
类型字符串`xml:“ type”`\  n客户ID字符串xml:“名称代码” 
日期输入的时间。时间xml:“ enterdate”`//这是有问题的字段
浮点数64 xml:“总值” 
容器TransactionDetailContainer xml: 子文件”`

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • duangan4070 2014-07-29 12:24

    I had the same problem.

    time.Time doesn't satisfy the xml.Unmarshaler interface. And you can not specify a date fomat.

    If you don't want to handle the parsing afterward and you prefer to let the xml.encoding do it, one solution is to create a struct with an anonymous time.Time field and implement your own UnmarshalXML with your custom date format.

    type Transaction struct {
        DateEntered     customTime     `xml:"enterdate"` // use your own type that satisfies UnmarshalXML
    type customTime struct {
    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

    If your XML element uses an attribut as a date, you have to implement UnmarshalXMLAttr the same way.


    解决 无用
    打赏 举报

相关推荐 更多相似问题