为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Go 解析 XML 文件

使用 Go 解析 XML 文件

Go
倚天杖 2023-07-26 13:13:04
我是 Go 新手。我有一个任务要做,我有一个具有以下结构的 xml 文件。该文件中还有许多其他标签记录。我需要读取所有记录,并打印有关音乐种类的信息,但仅限于数据字段标记等于“650”且子字段代码标记=“a”的情况。<record>  <leader>01153cjm a22002771a 4500</leader>  <controlfield tag="001">   00000838 </controlfield>  <controlfield tag="003">DLC</controlfield>  <controlfield tag="005">20030506181700.0</controlfield>  <controlfield tag="007">sd|zsngnnmmned</controlfield>  <controlfield tag="008">000824s1998    nyuppn                  d</controlfield>  <datafield tag="050" ind1="0" ind2="0">    <subfield code="a">SDA 16949</subfield>  </datafield>    <subfield code="a">   00000838 </subfield>  </datafield>  <datafield tag="020" ind1=" " ind2=" ">    <subfield code="c">$15.98</subfield>  </datafield>  <datafield tag="024" ind1="1" ind2=" ">    <subfield code="a">601215312621</subfield>  </datafield>  <datafield tag="650" ind1=" " ind2="0">    <subfield code="a">Rap (Music)</subfield>  </datafield></record>我的代码是:package mainimport (    "encoding/xml"    "fmt"    "io/ioutil"    "os")type Record struct {    XMLName      xml.Name `xml:"record"`    Text         string   `xml:",chardata"`    Leader       string   `xml:"leader"`    Controlfield []struct {        Text string `xml:",chardata"`        Tag  string `xml:"tag,attr"`    } `xml:"controlfield"`    Datafield []struct {        Text     string `xml:",chardata"`        Tag      string `xml:"tag,attr"`        Ind1     string `xml:"ind1,attr"`        Ind2     string `xml:"ind2,attr"`        Subfield []struct {            Text string `xml:",chardata"`            Code string `xml:"code,attr"`        } `xml:"subfield"`    } `xml:"datafield"`}func main() {    xmlFile, err := os.Open("music_lite3.xml")    if err != nil {        fmt.Println(err)    }    fmt.Println("Successfully Opened music_lite3.xml")    defer xmlFile.Close()    data, _ := ioutil.ReadAll(xmlFile)    var record Record我在访问结构数据字段和子字段时遇到问题。似乎当调用 record.Datafield 和 record.Datafield.Subfield.Code Go 时无法识别结构。有人可以帮助我吗?提前致谢。
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

你的代码甚至无法编译。您需要对循环内的切片进行索引,如果不对其进行索引,则无法引用切片元素的字段。而且Record.Controlfield和Record.Datafield不是“相关的”,用嵌入式循环处理它们是没有意义的。


但是,您确实需要使用嵌套循环来检查Subfield其Datafield标签是否匹配。


像这样的东西:


for i := range record.Datafield {

    df := &record.Datafield[i]

    if df.Tag == "650" {

        for j := range df.Subfield {

            if df.Subfield[j].Code == "a" {

                fmt.Println("Kind of Music: " + df.Subfield[j].Text)

            }

        }

    }

}

在Go Playground上尝试一下。


请注意,您for range也可以用来“获取”给定索引处的元素,但由于您有某种使用匿名结构(而不是指针)的生成结构,这样的循环将复制所有元素(因此我仍然使用“手动索引”)。


还要检查所有错误,例如ioutil.ReadAll(xmlFile)和xml.Unmarshal(data, &record)。


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信