Golang XML Unmarshal and time.Time fields

我的未来我决定 提交于 2019-12-03 01:36:19

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 {
    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
}

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

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

From what I have read the encoding/xml has some known issues that have been put off until a later date...

To get around this issue, instead of using the type time.Time use string and handle the parsing afterwards.

I had quite a bit of trouble getting time.Parse to work with dates in the following format: "Fri, 09 Aug 2013 19:39:39 GMT"

Oddly enough I found that "net/http" has a ParseTime function that takes a string that worked perfectly... http://golang.org/pkg/net/http/#ParseTime

Paweł Szczur

I've implemented a xml dateTime format conforming a spec, you can find it on GitHub: https://github.com/datainq/xml-date-time

You can find XML dateTime in W3C spec

const shortForm = "20060102" // yyyymmdd date format

It is unreadable. But it is right in Go. You can read the source in http://golang.org/src/time/format.go

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!