在运行时更改结构标记 (xml)
Change struct tag (xml) at runtime
有一个结构:
type S struct {
Value string `xml:"value,attr"`
}
我想将结构编码为 XML 文件。但是,我希望Value
的属性名称在每个文件中都不同:
s1 := S{
Value: "One"
}
应编码为:
<S value="One"></S>
和
s2 := S{
Value: "Two"
}
应编码为:
<S category="Two"></S>
因此,我需要以某种方式更改 XML 元素名称,或者更改字段上的标签。这可能吗?
我检查了reflect
(https://golang.org/pkg/reflect/#Value.FieldByName),但是由于FieldByName
returns 一个值类型并且没有Set
方法,我不认为可以使用反射。
(我不知道为什么别人删了他们的答案,但这是我的。)
您可以使用 ,attr
和 ,omitempty
的组合
type S struct {
Value string `xml:"value,attr,omitempty"`
Category string `xml:"category,attr,omitempty"`
}
(playground: http://play.golang.org/p/C9tRlA80RV) 或创建自定义 xml.MarshalerAttr
type S struct {
Value Val `xml:",attr"`
}
type Val struct{ string }
func (v Val) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if v.string == "One" {
return xml.Attr{Name: xml.Name{Local: "value"}, Value: v.string}, nil
}
return xml.Attr{Name: xml.Name{Local: "category"}, Value: v.string}, nil
}
(操场:http://play.golang.org/p/a1Wd2gonb_)。
第一种方法更简单但不太灵活,而且也会使结构更大。第二种方法稍微复杂一些,但也更健壮和灵活。
有一个结构:
type S struct {
Value string `xml:"value,attr"`
}
我想将结构编码为 XML 文件。但是,我希望Value
的属性名称在每个文件中都不同:
s1 := S{
Value: "One"
}
应编码为:
<S value="One"></S>
和
s2 := S{
Value: "Two"
}
应编码为:
<S category="Two"></S>
因此,我需要以某种方式更改 XML 元素名称,或者更改字段上的标签。这可能吗?
我检查了reflect
(https://golang.org/pkg/reflect/#Value.FieldByName),但是由于FieldByName
returns 一个值类型并且没有Set
方法,我不认为可以使用反射。
(我不知道为什么别人删了他们的答案,但这是我的。)
您可以使用 ,attr
和 ,omitempty
type S struct {
Value string `xml:"value,attr,omitempty"`
Category string `xml:"category,attr,omitempty"`
}
(playground: http://play.golang.org/p/C9tRlA80RV) 或创建自定义 xml.MarshalerAttr
type S struct {
Value Val `xml:",attr"`
}
type Val struct{ string }
func (v Val) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if v.string == "One" {
return xml.Attr{Name: xml.Name{Local: "value"}, Value: v.string}, nil
}
return xml.Attr{Name: xml.Name{Local: "category"}, Value: v.string}, nil
}
(操场:http://play.golang.org/p/a1Wd2gonb_)。
第一种方法更简单但不太灵活,而且也会使结构更大。第二种方法稍微复杂一些,但也更健壮和灵活。