首页 > 解决方案 > XML Unmarshal base64 字符串以在 Golang 中构造

问题描述

目前,我正在实现自定义 unmarshal xml,Bar它会将 base64 字符串解组为Bar结构。

但是当我运行这个程序时,它就像无限递归解组我的自定义解组一样的 stackoverflow。

去游乐场: 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
}

谢谢!

标签: xmlgo

解决方案


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)

推荐阅读