我必须解析旧版系统的xml输出,出于某种原因,他们认为添加值的ID作为标记名会很明智。
像这样:
<ValueList>
<ArraySize>2</ArraySize>
<v89BNZMpdlWXkuv>value1</v89BNZMpdlWXkuv>
<v89N83oCrGhI7jh>value2</v89N83oCrGhI7jh>
</ValueList>
我想将其解析为这样的结构:
type ValueList struct {
Values []Value
}
type Value struct {
ID string
Value String
}
我已经开始使用自定义解组功能
func (vl *ValueList) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
...
}
并从xml.Decoder
获取令牌,但这很丑陋。有更好的方法吗?
答案 0 :(得分:1)
如果您不想将其存储在结构中,则可以参考以下内容:
它基本上采用XML格式并返回一个映射,键为标记名称,值为标记值。
对于您而言,生成的地图将是:
{
"ValueList>ArraySize":"2",
"ValueList>v89BNZMpdlWXkuv":"value1",
"ValueList>v89N83oCrGhI7jh":"value2"
}
密钥分隔符可以作为参数发送。符号“>”是作为参数发送的分隔符。
答案 1 :(得分:0)
是的,您可以使用xmlquery来解析XML并提取数据,甚至是动态标签名称。像这样的代码:
doc,err:=xmlquery.Parse(`<xml>..`)
node:=xmlquery.FindOne(doc,"//ValueList")
// Travel all child-node of ValueList
for n:=node.FirstChild;n!=nil;n=n.NextSibling{
fmt.Println(n.Data) // Ouptut name: ArraySize,v89BNZMpdlWXkuv,v89N83oCrGhI7jh
fmt.Println(n.InnerText())// Value of child-node.
}
希望可以帮助您。