如何在Go中解组xml枚举属性?

时间:2019-05-26 22:17:25

标签: xml go unmarshalling xml-attribute

我想在go中将xml属性解析为iota枚举类型(int)。

在下面您可以看到我尝试的操作,但是由于无法获取枚举变量的地址,因此无法正常工作。

type EnumType int
const (
    EnumUnknown EnumType = iota
    EnumFoo
    EnumBar
)

func (E *EnumType) UnmarshalXMLAttr(attr xml.Attr) error {
    switch attr.Value {
    case "foo":
        E = &EnumFoo
    case "bar":
        E = &EnumBar
    default:
        E = &EnumUnknown
    }
    return nil
}


// Example of how the unmarshal could be called:
type Tag struct {
    Attribute EnumType `xml:"attribute,attr"`
}

func main() {
    tag := &Tag{}
    xml.Unmarshal([]byte("<tag attribute=\"foo\"/>"), tag)
}

还有其他方法可以使UnmarshalXMLAttr与int类型一起工作吗?

更新:我知道我可以通过在Tag中添加UnmarshalXML方法来解决此问题,但我想尽可能避免这种情况,因为我有很多具有不同属性的不同标签,但只有少数自定义类型属性。因此,不希望为每个标签实施UnmarshalXML方法。

1 个答案:

答案 0 :(得分:1)

我通过将int包装在结构中解决了这个问题。

type EnumType int
const (
    EnumUnknown EnumType = iota
    EnumFoo
    EnumBar
)
type EnumContainer struct {
    Value EnumType
}

func (E *EnumContainer) UnmarshalXMLAttr(attr xml.Attr) error {
    switch attr.Value {
    case "foo":
        E.Value = EnumFoo
    case "bar":
        E.Value = EnumBar
    default:
        E.Value = EnumUnknown
    }
    return nil
}


// Example of how the unmarshal could be called:
type Tag struct {
    Attribute EnumContainer `xml:"attribute,attr"`
}

func main() {
    tag := &Tag{}
    xml.Unmarshal([]byte("<tag attribute=\"foo\"/>"), tag)

是否有一种“更优雅”的方式?或者我应该对自己现在拥有的东西感到满意?