I'm new on Go. I have a task to do where I have a xml file with the following structure. There many other tag record in this file.
I need to read all the records, and print the information about the Kind of music but only where datafield tag is equal "650" and the subfield code tag = "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>
<datafield tag="010" ind1=" " ind2=" ">
<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>
My code is:
package main
import (
"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
xml.Unmarshal(data, &record)
for j := 0; j < len(record.Controlfield); j++ {
for i := 0; i < len(record.Datafield); i++ {
if record.Datafield == "650" {
if record.Datafield.Subfield.Code == "a" {
fmt.Println("Kind of Music: " + record.Datafield.Subfield.Text)
}
}
}
}
}
I'm having problems to acess the structs datafield and subfield. It seems that when a call record.Datafield and record.Datafield.Subfield.Code Go is not recognizing the structs.
Anyone can help me? Thanks in advance.
=)