【发布时间】:2016-04-29 13:38:33
【问题描述】:
我正在尝试像这样在 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 等)告诉我 value 属性的类型是什么。我试图解析的 XML 是 an international standard 的一部分,所以我无法控制它的定义。解析这些东西并不难,比如:
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 解组方法联系起来,只手动处理棘手的部分,还是我需要从头开始为这种类型编写整个解组器?
【问题讨论】:
-
我认为编写自定义解组器几乎是唯一的方法。
-
这是其他 XML 的一部分,其定义是 1000 行中的 10 行。我必须自己为整个事情编写一个解组器吗?
-
不,只是为了属性结构。
-
啊,我明白了。如果我在结构中添加 Unmarshal 方法,它会被 xml.Decoder.DecodeElement 自动调用?
-
是的,但请记住,您还必须分配代码成员。如果你弄明白了,你应该发布代码作为答案。
标签: go xml-parsing hl7-fhir