为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
catspeake 2023-06-05 13:22:39
我是 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 mainimport (    "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游乐场
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您可以实施自定义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 []Rate


func (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)

        }

    }

}

去游乐场


查看完整回答
反对 回复 2023-06-05
?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信