Golang XML Unmarshal and time.Time fields

前端 未结 4 1763
南笙
南笙 2021-02-04 01:14

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

相关标签:
4条回答
  • 2021-02-04 01:41

    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

    0 讨论(0)
  • 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

    0 讨论(0)
  • 2021-02-04 01:50

    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

    0 讨论(0)
  • 2021-02-04 01:55
    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

    0 讨论(0)
提交回复
热议问题