在尝试解组嵌套XML时抓取所有字段

时间:2017-08-03 03:42:41

标签: xml go

以下是我尝试使用Golang的一些XML文件。实际的XML文件超过500 MB。

<artists>
   <artist>
      <id>1</id>
      <name>The Persuader</name>
      <realname>Jesper Dahlbäck</realname>
      <profile />
   </artist>
    <artist>
       <id>22</id>
       <name>DATacide</name>
       <profile>Datacide began recording together in 1993, after Tetsu Inoue met Uwe Schmidt while vacationing near Frankfurt.
       </profile>
       <members>
          <id>25</id>
          <name>Tetsu Inoue</name>
          <id>519207</id>
          <name>Uwe Schmidt</name>
       </members>
    </artist>
</artists>

这是Go代码。我想要获取MEMBERS部分中的所有ID字段,但我的代码只抓取最后一个ID字段,其中可能没有,一个或多个。如何将MEMBERS部分中的所有ID都存入MEMBERS数组?

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "os"
)

type Artists struct {
    XMLName xml.Name `xml:"artists"`
    Artist  []Artist `xml:"artist"`
}

type Artist struct {
    XMLName xml.Name `xml:"artist"`
    ArtistID uint32 `xml:" id,omitempty"`
    ArtistName string `xml:" name,omitempty"`
    Profile string `xml:" profile,omitempty"`
    RealName string `xml:" realname,omitempty"`
    Members MembersID `xml:"members,omitempty"`
}

type MembersID struct {
    MemberID uint32 `xml:"id,omitempty"`
}

func main() {

    xmlFile, err := os.Open("short_artists.xml")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println("Successfully opened artists file")
    defer xmlFile.Close()

    byteValue, _ := ioutil.ReadAll(xmlFile)
    var artists Artists
    xml.Unmarshal(byteValue, &artists)

    for i := 0; i < len(artists.Artist); i++ {
        fmt.Println("ArtistID: " + fmt.Sprint(artists.Artist[i].ArtistID))
        fmt.Println("Name: " + artists.Artist[i].ArtistName)
        fmt.Println("Real Name: " + artists.Artist[i].RealName)
        fmt.Println("Profile: " + artists.Artist[i].Profile)
        fmt.Println("")
        fmt.Printf("%v\n",artists.Artist[i].Members)
        fmt.Println("")
    }
}

我所有的Google和DuckDuckGo搜索都是紫色的。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

问题是MembersID结构定义。你必须使用切片。

type MembersID struct {
    MemberID []uint32 `xml:"id,omitempty"`
}

播放链接:https://play.golang.org/p/h4qTmSQoRg

输出:

ArtistID: 1
Name: The Persuader
Real Name: Jesper Dahlbäck
Profile: 

Members: []

ArtistID: 22
Name: DATacide
Real Name: 
Profile: Datacide began recording together in 1993, after Tetsu Inoue met Uwe Schmidt while vacationing near Frankfurt.


Members: [25 519207]

额外提示:

如果需要,可以选择性地获取XML路径值。例如,获取XML路径的所有ID artist>members>id

type MemberID struct {
    IDs []uint32 `xml:"artist>members>id"`
}

播放链接:https://play.golang.org/p/sj7XPisgl7

输出:

[25 519207]