From 76e3031ff94c7d3ce116a1e5d5271fee606ef3bf Mon Sep 17 00:00:00 2001 From: leyle Date: Thu, 15 Aug 2019 18:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20xmltomap=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util.go | 66 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/util.go b/util.go index 02bc1ca..b65bcce 100644 --- a/util.go +++ b/util.go @@ -1,42 +1,62 @@ package wxpay import ( - "bytes" "crypto/tls" "encoding/pem" "encoding/xml" "golang.org/x/crypto/pkcs12" "log" "strconv" - "strings" "time" + "io" + "bytes" ) -func XmlToMap(xmlStr string) Params { +type xmlMapEntry struct { + XMLName xml.Name + Value string `xml:",chardata"` +} - params := make(Params) - decoder := xml.NewDecoder(strings.NewReader(xmlStr)) - - var ( - key string - value string - ) - - for t, err := decoder.Token(); err == nil; t, err = decoder.Token() { - switch token := t.(type) { - case xml.StartElement: // 开始标签 - key = token.Name.Local - case xml.CharData: // 标签内容 - content := string([]byte(token)) - value = content - } - if key != "xml" { - if value != "\n" { - params.SetString(key, value) - } +func (m Params) MarshalXML(e *xml.Encoder, start xml.StartElement) error { + if len(m) == 0 { + return nil + } + start.Name.Local = "xml" // 更改xml开始标签 + err := e.EncodeToken(start) + if err != nil { + return err + } + + for k, v := range m { + e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: v}) + } + + return e.EncodeToken(start.End()) +} + +func (m *Params) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + *m = Params{} + for { + var e xmlMapEntry + + err := d.Decode(&e) + if err == io.EOF { + break + } else if err != nil { + return err } + + (*m)[e.XMLName.Local] = e.Value } + return nil +} +func XmlToMap(xmlStr string) Params { + params := make(Params) + err := xml.Unmarshal([]byte(xmlStr), ¶ms) + if err != nil { + panic(err) + } return params }