我是 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 關注
- 156 瀏覽
添加回答
舉報
0/150
提交
取消