【问题标题】:golang xml parsing dynamic tag namesgolang xml解析动态标签名称
【发布时间】:2018-08-03 06:51:18
【问题描述】:

我必须解析遗留系统的 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 获取令牌,但这很难看。有没有更好的办法?

【问题讨论】:

标签: xml go xml-parsing


【解决方案1】:

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

Dynamic Xml Processing

它基本上接受一个XML并返回一个映射,其中key是标签名称,value是标签值。

在您的情况下,生成的地图将是:

{
"ValueList>ArraySize":"2",
"ValueList>v89BNZMpdlWXkuv":"value1",
"ValueList>v89N83oCrGhI7jh":"value2"
}

键的分隔符可以作为参数发送。这里符号“>”是作为参数发送的分隔符。

【讨论】:

    【解决方案2】:

    是的,您可以使用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.
    }
    

    希望能帮到你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2023-03-14
      相关资源
      最近更新 更多