objcoding / wxpay

🔥微信支付(WeChat Pay) SDK for Golang
MIT License
531 stars 144 forks source link

XmlToMap 这个方法有bug,当xml 前面有空格的时候,返回的map为空 #14

Open xyy11070 opened 5 years ago

xyy11070 commented 5 years ago
str := `<xml>
   <trade_type><![CDATA[APP]]></trade_type>
   <prepay_id><![CDATA[wx20190506151427404120]]></prepay_id>
   <nonce_str><![CDATA[1557126867008139000]]></nonce_str>
   <return_code><![CDATA[SUCCESS]]></return_code>
   <err_code_des><![CDATA[ok]]></err_code_des>
   <sign><![CDATA[3C323ECE220CC631240E874F80C3737D]]></sign>
   <mch_id><![CDATA[1225268501]]></mch_id>
   <return_msg><![CDATA[OK]]></return_msg>
   <appid><![CDATA[wxe353414396c4b931]]></appid>
   <device_info><![CDATA[sandbox]]></device_info>
   <result_code><![CDATA[SUCCESS]]></result_code>
   <err_code><![CDATA[SUCCESS]]></err_code>
 </xml>`
    mp := wxpay.XmlToMap(str)
cs50Mu commented 4 years ago

I fixed this bug, for anyone who are bothered by this problem, here is the code, it's actually very simple:


func XmlToMap(xmlStr string) Params {

    params := make(Params)
    decoder := xml.NewDecoder(strings.NewReader(xmlStr))

    var (
        key   string
        value string
    )

    inBetween := false
    for t, err := decoder.Token(); err == nil; t, err = decoder.Token() {
        switch token := t.(type) {
        case xml.StartElement:
            key = token.Name.Local
            if key == "xml" {
                continue
            }
            inBetween = true
        case xml.CharData:
            if !inBetween {
                continue
            }
            value = string([]byte(token))
            params[key] = value
        case xml.EndElement:
            inBetween = false
        }

    }

    return params
}