有一个结构:
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
返回值类型并且没有Set
方法,我认为无法使用反射。
(我不知道为什么对方删除了他们的答案,但这是我的。
您可以使用,attr
和,omitempty
的组合
type S struct {
Value string `xml:"value,attr,omitempty"`
Category string `xml:"category,attr,omitempty"`
}
(游乐场: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_)。
第一种方法更容易,但不太灵活,并且还使结构更大。第二种方法稍微复杂一些,但也更加健壮和灵活。