【问题标题】:Parsing Multiple XML Files with Custom tags使用自定义标签解析多个 XML 文件
【发布时间】:2017-11-28 11:42:23
【问题描述】:

我要解析很多 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>

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

先谢谢你了。

【问题讨论】:

  • 你的例子不是很清楚,什么包装响应标签?
  • 没有包裹响应标签。该示例是整个 XML 文档。

标签: xml parsing go


【解决方案1】:

随着 XML 的发展,这很糟糕;标签名称不应该用于数据,只有标签主体和属性值应该保存数据。但是,一切都没有丢失!根据the documentation on encoding/xml,您可以使用,any 标记来映射应包含“与上述任何规则都不匹配的子元素”的字段。您可以将其用作一种通配符,以匹配未以其他方式映射的任何子元素 - 在您的情况下,您在编译时不知道其标签名称的子元素:

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

游乐场示例:https://play.golang.org/p/lo6bJBRvgV

【讨论】:

  • 谢谢你,想知道是否有通配符。完全同意你的观点,没有给出标签名称的数据。在我使用的 API 上,标签名称是动态的,老实说对他们来说很糟糕,但对此无能为力。幸运的是,所有数据都保存在标签正文中。感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2019-12-09
相关资源
最近更新 更多