golang xml解析动态标记名称

时间:2018-08-03 06:51:18

标签: xml go xml-parsing

我必须解析旧版系统的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获取令牌,但这很丑陋。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您不想将其存储在结构中,则可以参考以下内容:

Dynamic Xml Processing

它基本上采用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.
}

希望可以帮助您。