我是 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)。
- 1 回答
- 0 关注
- 119 浏览
添加回答
举报
0/150
提交
取消