亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 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 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號