使用自定义标记解析多个XML文件

时间:2017-11-28 11:42:24

标签: xml parsing go

我必须解析许多XML文档,我已经知道解析文件的逻辑,但问题是,每个xml文件的标记都不同。

这是我到目前为止所拥有的

type Data struct {
     Rows []Info `xml:"domain-google.com"` // <- This is custom and needs to change (e.g. the next xml doc tag will be `xml:"domain-facebook.com"`
}

type Info struct {
     Domain string `xml:"domain"`
 }

//解析xml的示例逻辑

    xmlFile, err := http.Get("somefiles.xml")
    if err != nil { fmt.Println(err) }
    var data Data
    if err = xml.NewDecoder(xmlFile.Body).Decode(&data); err != nil {
        fmt.Println(err)
    }
    for _, rows := range data.Rows {
        fmt.Println(rows.Domain)
    }

示例xml文档

<response>
   <!-- This tag is what is custom every time -->
   <domain-google.com>
      <domain>google.com</domain>
   </domain-google.com>
</response>

<response>
   <!-- This tag is what is custom every time -->
   <domain-facebook.com>
      <domain>facebook.com</domain>
   </domain-facebook.com>
</response>

知道如何解决这个问题吗?

先谢谢你。

1 个答案:

答案 0 :(得分:0)

随着XML的发展,这非常糟糕;标签名称不应该用于数据,只有标签主体和属性值应该包含数据。但是,一切都不会丢失!根据{{​​3}},您可以使用,any标记来映射应包含&#34;不符合上述任何规则&#34;的子元素的字段。您可以将其用作一种通配符,以匹配任何未映射的子元素 - 在您的情况下,是一个在编译时您不知道其标记名称的子元素:

type Data struct {
    Rows []Info `xml:",any"`
}

游乐场示例:the documentation on encoding/xml