Golang XML Unmarshal и time.Time поля
У меня есть XML-данные, которые я извлекаю с помощью REST API, что я не привязываю к структуре GO. Одним из полей является поле даты, однако формат даты, возвращаемый API, не соответствует формату времени по умолчанию. Формат времени синтаксиса и, следовательно, немаршал не работает.
Можно ли указать функцию unmarshal, формат даты которой будет использоваться в time.Time parsing? Я хотел бы использовать правильно определенные типы, и использование строки для хранения поля datetime кажется неправильным.
Пример структуры:
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".
Ответы
Ответ 1
У меня была та же проблема.
time.Time
не удовлетворяет интерфейсу xml.Unmarshaler
. И вы не можете указать дату fomat.
Если вы не хотите обрабатывать синтаксический анализ позже, и вы предпочитаете разрешать 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-элемент использует атрибут как дату, вы должны реализовать UnmarshalXMLAttr таким же образом.
См. http://play.golang.org/p/EFXZNsjE4a
Ответ 2
Из того, что я прочитал, в кодировке /xml есть некоторые известные проблемы, которые были отложены до более поздней даты...
Чтобы обойти эту проблему, вместо использования типа time.Time
используйте string
и обработайте синтаксический анализ впоследствии.
У меня было немного проблем с получением времени. Для работы с датами в следующем формате: "Пт, 09 авг. 2013 19:39:39 GMT"
Как ни странно, я обнаружил, что "net/http" имеет функцию ParseTime, которая принимает строку, которая отлично работает...
http://golang.org/pkg/net/http/#ParseTime
Ответ 3
Я внедрил XML-формат dateTime, соответствующий спецификации, вы можете найти его на GitHub: https://github.com/datainq/xml-date-time
Вы можете найти XML dateTime в W3C spec
Ответ 4
const shortForm = "20060102" // yyyymmdd date format
Это невозможно прочитать. Но это правильно в Го. Вы можете прочитать источник в http://golang.org/src/time/format.go