【问题标题】:Golang - Marshaling XML time.Time as date format for XML attributeGolang - 将 XML time.Time 编组为 XML 属性的日期格式
【发布时间】:2016-04-13 19:30:14
【问题描述】:

我正在尝试格式化自定义时间类型 Date,它实现了 Marshaler 接口,并在编写为 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)}

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

【问题讨论】:

    标签: xml go


    【解决方案1】:

    您正在实现错误的接口。

    由于 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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 2014-08-11
      • 2011-05-05
      • 1970-01-01
      • 2016-04-23
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多