在运行时更改结构标记 (xml)



有一个结构:

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_)。

第一种方法更容易,但不太灵活,并且还使结构更大。第二种方法稍微复杂一些,但也更加健壮和灵活。

相关内容

  • 没有找到相关文章

最新更新