Golang - Marshaling XML time.Time作为XML属性的日期格式

时间:2016-04-13 19:30:14

标签: xml go

我正在尝试格式化实现Marshaler接口的自定义时间类型Date,并在编写为XML时将其自身格式化为“2006-01-02”。

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
}

我使用this SO作为参考,但错误 - & xml.UnsupportedTypeError {Type:(* reflect.rtype)} - 会被抛出。

我错过了什么,有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您正在实施错误的界面。

由于Date类型是作为属性编组的(如xml:"DOB,attr"标记所示),因此需要实现xml.MarshalerAttr接口:

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

所以你可能需要添加这样的代码:

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
}

请注意,我从值字符串中删除了显然不必要的引号。