gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:05:16 26 4
gpt4 key购买 nike

有一个结构:

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"`
}

(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
}

( Playground :http://play.golang.org/p/a1Wd2gonb_)。

第一种方法更简单但不够灵活,而且会使结构体更大。第二种方法稍微复杂一些,但也更健壮和灵活。

关于xml - 在运行时更改结构标记 (xml),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30940332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com