我将尝试在Go语言中对以下格式的XML进行反序列化:
<property>
<code value="abc"/>
<valueBoolean value="true"/>
</property>
或者这个
<property>
<code value="abc"/>
<valueString value="apple"/>
</property>
或者这个
<property>
<code value="abc"/>
<valueDecimal value="3.14159"/>
</property>
将等等内容转化为这样的格式:
type Property struct {
Code string `xml:"code>value,attr"`
Value interface{}
}
标签中的(valueBoolean
,valueString
等)告诉我值属性的类型。我正在尝试解析的XML是国际标准的一部分,因此我无法控制其定义。实现解析这些内容不难,可以做如下处理:
var value string
for a := range se.Attr {
if a.Name.Local == "value" {
value = a.Value
} else {
// Invalid attribute
}
}
switch se.Name.Local {
case "code":
case "valueBoolean":
property.Value = value == "true"
case "valueString":
property.Value = value
case "valueInteger":
property.Value, err = strconv.ParseInteger(value)
case "valueDecimal":
property.Value, err = strconv.ParseFloat(value)
...
}
但我不知道如何告诉XML包去找它,而这些东西被埋在其他XML中,我真的很想使用xml.Unmarshal
进行处理。或者,我可以重新定义类型为:
type Property struct {
Code string `xml:"code>value,attr"`
ValueBoolean bool `xml:"valueBoolean>value,attr"`
ValueString string `xml:"valueString>value,attr"`
ValueInteger int `xml:"valueInteger>value,attr"`
ValueDecimal float `xml:"valueDecimal>value,attr"`
}
但这种方法非常低效,尤其是考虑到我有大量这些东西的实例,这样做没有办法在不添加另一个属性来指示类型的情况下推导出类型。
我能否以某种方式将其绑定到正常的XML取消编组方法中,只是手动处理棘手的部分,或者需要从头编写此类型的完整取消编组器?