2016-04-13 16 views
3

マーシャラインターフェイスを実装したカスタムのタイムタイプDateをフォーマットしようとしていますが、XMLとして書かれたときには単に "2006-01-02" 。Golang - XMLのマーシャリングXML time.imeとしてのXML形式の日付形式

type Person struct { 
    ... 
    DateOfBirth   Date  `xml:"DOB,attr"` 
    ... 
} 

type Date time.Time 

func (d Date) MarshalXML(e *xml.Encoder, start xml.StartElement) error { 
    dateString := fmt.Sprintf("\"%v\"", time.Time(d).Format("2006-01-02"))  
    e.EncodeElement(dateString, start) 

    return nil 
} 

Iを基準としてthis SOを使用して、エラーた - & xml.UnsupportedTypeError {タイプ:(* reflect.rtype)}が - スローされます。

私は何か、アイデアが欠落していますか?

答えて

5

間違ったインターフェイスを実装しています。

type MarshalerAttr interface { 
    MarshalXMLAttr(name Name) (Attr, error) 
} 

だからあなたは、おそらくこのようなコードを追加する必要があります(xml:"DOB,attr"タグから示されるように)日付型は属性としてマーシャリングされることを意図されているので

、それはxml.MarshalerAttrインタフェースを実装する必要があります。

func (d Date) MarshalXMLAttr(name xml.Name) (xml.Attr, error) { 
    dateString := time.Time(d).Format("2006-01-02")  
    attr := xml.Attr { 
     name, 
     dateString, 
    } 

    return attr, nil 
} 

明らかに不要な引用符を値文字列から削除しました。