2013-06-25 23 views
11

XML verisi var GİT API'sini kullanarak bir GE yapıya dönüştürdüğüm bir REST API'sı aracılığıyla alıyorum. Alanlardan biri bir tarih alanıdır, ancak API tarafından döndürülen tarih biçimi varsayılan saat ile eşleşmez. Zaman ayrıştırma formatı ve bu nedenle unmarshal başarısız olur.Golang XML Unmarshal ve time.Time alanları

time.Time ayrıştırma kullanılacak tarih biçimini unmarshal işlevine belirtmek için herhangi bir yolu var mı? Düzgün olarak tanımlanmış türleri kullanmak ve bir datetime alanının yanlış kalmasını sağlamak için bir dize kullanmak istiyorum.

Numune yapı: tarih formatı döndü

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

"yyyyaagg" dir. Ben kodlama/xml okudum kadarıyla

+0

XML DateTime bulabilirsiniz, sadece marshalling ile ilgileniyor olsa bile. Ayrıca https://groups.google.com/forum/#!topic/golang-nuts/IM3ZIcYXbz4 – Intermernet

+0

, https://code.google.com/p/go/issues/detail?id=2771 – Intermernet

cevap

40

Aynı sorun vardı.

time.Time

xml.Unmarshaler arayüzünü tatmin etmiyor. Ve bir tarih fomat belirtemezsiniz. Eğer sonradan ayrıştırmayı işlemek istemiyorum ve xml.encoding yapalım isterseniz

, tek çözüm anonim time.Time alanına sahip bir yapı oluşturmak ve kendi UnmarshalXML ile özel tarih biçimini uygulamaktır. XML elemanı tarih olarak bir Attribut kullanıyorsa

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 
} 

, sen UnmarshalXMLAttr aynı şekilde uygulamak zorunda.

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

+0

Bu beni doğru yola düşürdü. CustomTime time.Time 'yerine - altta yatan' time.Time 'ile bir struct öğesi olarak uğraşmaya gerek kalmadan uğraşmakla daha da kolaydım. – Colselaw

+1

DecodeElement öğesinin bir hata döndürdüğünden emin olun, aksi halde işaretlenip iade edilmemesi gereken bir hata döndürür. – AndreiM

1

sonraki bir tarihe kadar ertelendi edilmiştir bilinen bazı sorunları ...

yerine türü time.Time kullanım string kullanmak yerine, bu sorunu çözmek ve işlemek için vardır daha sonra ayrıştırma. Rahatsız time.Parse aşağıdaki biçimde tarihleri ​​ile çalışmaya almanın biraz vardı

: "Cum, 9 Ağustos 2013 19:39:39 GMT" Garip buldum

"olduğunu net/http "Mükemmel çalışan bir dize alır bir ParseTime işlevi vardır ... http://golang.org/pkg/net/http/#ParseTime

+0

de bakabilirsiniz En tuhaf şey, bir tarih alanının türünü ayarladığımda, her şeyi ayrıştırmaya başladım .... –