Xml 在golang中将单个字段编组为两个标记
试图了解一种为以下结构的xml创建自定义封送拆收器的方法:Xml 在golang中将单个字段编组为两个标记,xml,go,marshalling,Xml,Go,Marshalling,试图了解一种为以下结构的xml创建自定义封送拆收器的方法: 2004-12-22 14:00 我在想这样的事情: 类型约会结构{ DateTime.time`xml:“?”` } 问题是,我会用什么来代替???要将单个字段保存到两个不同的xml标记中?快速猜测,您不能。您应该使用约会类型实现xml.Marshaler接口…复杂的封送/解封行为通常需要满足封送/解封接口(对于go中的xml、JSON和类似的设置类型,这是正确的) 您需要使用MarshalXML()函数满足xml.Marsha
2004-12-22
14:00
我在想这样的事情:
类型约会结构{
DateTime.time`xml:“?”`
}
问题是,我会用什么来代替???要将单个字段保存到两个不同的xml标记中?快速猜测,您不能。您应该使用
约会
类型实现xml.Marshaler
接口…复杂的封送/解封行为通常需要满足封送/解封接口(对于go中的xml、JSON和类似的设置类型,这是正确的)
您需要使用MarshalXML()
函数满足xml.Marshaler
接口,如下所示:
package main
import (
"encoding/xml"
"fmt"
"time"
)
type Appointment struct {
DateTime time.Time
}
type appointmentExport struct {
XMLName struct{} `xml:"appointment"`
Date string `xml:"date"`
Time string `xml:"time"`
}
func (a *Appointment) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
n := &appointmentExport{
Date: a.DateTime.Format("2006-01-02"),
Time: a.DateTime.Format("15:04"),
}
return e.Encode(n)
}
func main() {
a := &Appointment{time.Now()}
output, _ := xml.MarshalIndent(a, "", " ")
fmt.Println(string(output))
}
// prints:
// <appointment>
// <date>2016-04-15</date>
// <time>17:43</time>
// </appointment>
主程序包
进口(
“编码/xml”
“fmt”
“时间”
)
类型约会结构{
日期时间,时间
}
类型指定导出结构{
XMLName结构{}`xml:“约会”`
日期字符串`xml:“日期”`
时间字符串`xml:“时间”`
}
func(a*约会)封送xml(e*xml.Encoder,start xml.StartElement)错误{
n:=&任命导出{
日期:a.DateTime.Format(“2006-01-02”),
时间:a.DateTime.Format(“15:04”),
}
返回e.Encode(n)
}
func main(){
a:=&约会{time.Now()}
输出,u:=xml.marshallindent(a,“,”)
fmt.Println(字符串(输出))
}
//印刷品:
//
// 2016-04-15
// 17:43
//
您可能需要创建自己的封送拆收器来实现xml。封送拆收器
将负责将DateTime
字段拆分为date
和time
,然后再封送到xml。是的,这是我已经做过的事情。并不是说这不是一个好的解决方案,但我认为可能会有更简单的解决方案