dqw70970 2019-04-24 02:45
浏览 89
已采纳

XML Unmarshal base64字符串在Golang中构造

Currently, I'm implementing custom unmarshal xml for Bar which will unmarshal base64 string to Bar struct.

But when I run this program, it's stackoverflow like infinite recursive unmarshal my custom unmarshal.

GO Playground: https://play.golang.org/p/QD4IdxhZr1Q

package main

import (
    "bytes"
    "encoding/base64"
    "encoding/xml"
    "fmt"
)

type Foo struct {
    A Bar `xml:"a"`
}

type Bar struct {
    B string `xml:"b"`
    C string `xml:"c"`
    D string `xml:"d"`
}

func main() {
    var foo Foo
    // Input
    s := `<Foo><a>PGI+Yi10ZXN0PC9iPjxjPmMtdGVzdDwvYz48ZD5kLXRlc3Q8L2Q+Cg==</a></Foo>`

    err := xml.Unmarshal([]byte(s), &foo)

    if err != nil {
        panic(err)
    }

    fmt.Println("Foo:", foo)

}

func (m *Bar) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    var s string
    err := d.DecodeElement(&s, &start)

    fmt.Println("Decode Element:", s)

    if err != nil {
        return err
    }

    data, err := base64.StdEncoding.DecodeString(s)

    if err != nil {
        return err
    }

    fmt.Println("Base64 Decoded string:", string(data))

    var buf bytes.Buffer
    buf.WriteString("<Bar>")
    buf.WriteString(string(data))
    buf.WriteString("</Bar>")
    result := buf.String()
    fmt.Println("After add root node:", result)

    xml.Unmarshal([]byte(result), &m)

    return nil
}

Thank you!

  • 写回答

1条回答 默认 最新

  • dongma7796 2019-04-24 03:02
    关注

    https://play.golang.org/p/yZVtiEbugWH

    // define new type called BBar
    // same with bar
    type BBar Bar 
    xx := new(BBar)
    // the BBar doesn't have UnmarshalXML method
    xml.Unmarshal([]byte(result), xx)
    *m = Bar(*xx)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵