xml之无法为 Go 结构解码 XML

softidea 阅读:61 2025-06-02 22:19:02 评论:0

我正在尝试在 golang 中编写一段代码,它需要一个 xml 并对其进行解码。
我很确定我在结构的最后做错了什么,但我不知道是什么。
因此,如果有人能告诉我为什么打印的价格没有任何值(value),以及如何解决这个问题,我将不胜感激。
非常感谢!

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), &currencies) 
    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) 
        } 
    } 
} 
 

请您参考如下方法:

尝试更改 评价结构到这个:

type Rate struct { 
    XMLName    xml.Name `xml:"Rate"` 
    Currency   string   `xml:"currency,attr"` 
    Multiplier string   `xml:"multiplier,attr"` 
    Rate       string   `xml:",chardata"` 
} 

而且我经常用这个网站来转换 XML 转到结构 .你也可以试试: https://www.onlinetool.io/xmltogo/


标签:XML
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号