如何解析具有相同名称的嵌套节点的 XML?

我是 Golang 新手,使用同名嵌套节点解析 XML 对我来说太难了。这是从第三方 API 中提取的 XML:


<?xml version="1.0" encoding="UTF-8"?>

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">

    <gesmes:subject>Reference rates</gesmes:subject>

    <gesmes:Sender>

        <gesmes:name>European Central Bank</gesmes:name>

    </gesmes:Sender>

    <Cube>

        <Cube time="2019-01-28">

            <Cube currency="USD" rate="1.1418"/>

            <Cube currency="JPY" rate="124.94"/>

            <Cube currency="BGN" rate="1.9558"/>

        </Cube>

        <Cube time="2019-01-25">

            <Cube currency="USD" rate="1.1346"/>

            <Cube currency="JPY" rate="124.72"/>

            <Cube currency="BGN" rate="1.9558"/>

        </Cube>

    </Cube>

</gesmes:Envelope>

我需要解析它,所以我有这样的输出:


&{Rates:[{Currency:USD Rate:1.1418 Date:2019-01-28} {Currency:JPY Rate:124.94 Date:2019-01-28} {Currency:BGN Rate:1.9558 Date:2019-01-28} {Currency:USD Rate:1.1346 Date:2019-01-25} {Currency:JPY Rate:124.72 Date:2019-01-25} {Currency:BGN Rate:1.9558 Date:2019-01-25}]}

这是我的代码:


package main


import (

    "encoding/xml"

    "fmt"

)



type Rate struct {

    Currency  string `xml:"currency,attr"`

    Rate      string `xml:"rate,attr"`

    Date    string `xml:"time,attr"`

}


type Rates struct {

    Rates []Rate `xml:"Cube>Cube>Cube"`

}


func main() {

    v := &Rates{}

    if err := xml.Unmarshal([]byte(src), v); err != nil {

        panic(err)

    }

    fmt.Printf("%+v\n\n", v)

}


const src = `<?xml version="1.0" encoding="UTF-8"?>

<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">

    <gesmes:subject>Reference rates</gesmes:subject>

    <gesmes:Sender>

        <gesmes:name>European Central Bank</gesmes:name>

    </gesmes:Sender>


我不知道如何将time属性插入 Rates 对象。任何帮助,将不胜感激。


这是在 golang游乐场


catspeake
浏览 135回答 2
2回答

守着星空守着你

您可以实施自定义xml.Unmarshaler以获得所需的结果。type Rate struct {    Currency string `xml:"currency,attr"`    Rate     string `xml:"rate,attr"`    Date     string `xml:"time,attr"`}type Rates struct {    Rates RateList `xml:"Cube>Cube"`}type RateList []Ratefunc (ls *RateList) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {    date := start.Attr[0].Value    for {        tok, err := d.Token()        if err != nil {            if err == io.EOF {                return nil            }            return err        }        if se, ok := tok.(xml.StartElement); ok {            rate := Rate{Date: date}            if err := d.DecodeElement(&rate, &se); err != nil {                return err            }            *ls = append(*ls, rate)        }    }}去游乐场

慕斯709654

确保您要么信任 XML,要么事先使用XSD之类的东西验证/清理它。出于安全原因,以及为了能够回顾并查看您“解组”的数据是否正确,应该这样做,因为当您处理大量 XML 时,其中一些肯定会被破坏。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go