我正在尝试用golang编写一段代码,该代码需要一个xml并解组。我很确定自己在结构末尾做错了什么,但我不知道该怎么做。因此,如果有人可以通过说出打印价格为什么没有任何价值以及如何解决此问题,我将不胜感激。非常感谢!
package main
import (
"encoding/xml"
"fmt"
"log"
)
type DataSet struct {
XMLName xml.Name `xml:"DataSet"`
Header Header `xml:"Header"`
Body Body `xml:"Body"`
}
type Header struct {
XMLName xml.Name `xml:"Header"`
Publisher string `xml:"Publisher"`
PublishingDate string `xml:"PublishingDate"`
MessageType string `xml:"MessageType"`
}
type Body struct {
XMLName xml.Name `xml:"Body"`
Subject string `xml:"Subject"`
OrigCurrency string `xml:"OrigCurrency"`
Cube Cube `xml:"Cube"`
}
type Cube struct {
XMLName xml.Name `xml:"Cube"`
Date string `xml:"date,attr"`
Rate []Rate `xml:"Rate"`
}
type Rate struct {
XMLName xml.Name `xml:"Rate"`
Currency string `xml:"currency,attr"`
Rate string `xml:"Rate"`
}
func main() {
myxml := `<DataSet xmlns="http://www.bnr.ro/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bnr.ro/xsd nbrfxrates.xsd">
<Header>
<Publisher>National Bank of Romania</Publisher>
<PublishingDate>2020-05-07</PublishingDate>
<MessageType>DR</MessageType>
</Header>
<Body>
<Subject>Reference rates</Subject>
<OrigCurrency>RON</OrigCurrency>
<Cube date="2020-05-07">
<Rate currency="AED">1.2169</Rate>
<Rate currency="AUD">2.8874</Rate>
<Rate currency="BGN">2.4666</Rate>
<Rate currency="BRL">0.7820</Rate>
<Rate currency="CAD">3.1747</Rate>
<Rate currency="CHF">4.5825</Rate>
<Rate currency="CNY">0.6303</Rate>
<Rate currency="CZK">0.1779</Rate>
<Rate currency="DKK">0.6466</Rate>
<Rate currency="EGP">0.2838</Rate>
<Rate currency="EUR">4.8242</Rate>
<Rate currency="GBP">5.5241</Rate>
<Rate currency="HRK">0.6373</Rate>
<Rate currency="HUF" multiplier="100">1.3776</Rate>
<Rate currency="INR">0.0589</Rate>
<Rate currency="JPY" multiplier="100">4.1970</Rate>
<Rate currency="KRW" multiplier="100">0.3648</Rate>
<Rate currency="MDL">0.2510</Rate>
<Rate currency="MXN">0.1852</Rate>
<Rate currency="NOK">0.4349</Rate>
<Rate currency="NZD">2.7048</Rate>
<Rate currency="PLN">1.0618</Rate>
<Rate currency="RSD">0.0410</Rate>
<Rate currency="RUB">0.0606</Rate>
<Rate currency="SEK">0.4545</Rate>
<Rate currency="THB">0.1380</Rate>
<Rate currency="TRY">0.6161</Rate>
<Rate currency="UAH">0.1668</Rate>
<Rate currency="USD">4.4695</Rate>
<Rate currency="XAU">243.2582</Rate>
<Rate currency="XDR">6.0847</Rate>
<Rate currency="ZAR">0.2406</Rate>
</Cube>
</Body>
</DataSet>`
var currencies DataSet
// we unmarshal our byteArray which contains our
// myxml content into 'currencies' which we defined above
err := xml.Unmarshal([]byte(myxml), ¤cies)
if err != nil {log.Fatal(err)}
for i := 0; i < len(currencies.Body.Cube.Rate); i++ {
fmt.Println(currencies.Body.Cube.Rate[i].Currency)
fmt.Println(currencies.Body.Cube.Rate[i].Rate)
if currencies.Body.Cube.Rate[i].Currency=="EUR"{
fmt.Println("EUR rate is: " + currencies.Body.Cube.Rate[i].Rate)
}
}
}
尝试将Rate结构更改为此:
type Rate struct {
XMLName xml.Name `xml:"Rate"`
Currency string `xml:"currency,attr"`
Multiplier string `xml:"multiplier,attr"`
Rate string `xml:",chardata"`
}
而且我经常使用此站点将XML转换为Go struct。您也可以尝试:https://www.onlinetool.io/xmltogo/