XmlToMap方法有Bug,我是这样修改的
jay-wlj opened this issue · 0 comments
type xmlMapEntry struct {
XMLName xml.Name
Value string xml:",chardata"
}
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
// 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" && value != "\n " {
// params.SetString(key, value)
// }
// }
// }
return params
}
func MapToXml(params Params) string {
buf, err := xml.Marshal(params)
if err != nil {
panic(err)
}
return string(buf)
// var buf bytes.Buffer
// buf.WriteString(<xml>
)
// for k, v := range params {
// buf.WriteString(<
)
// buf.WriteString(k)
// buf.WriteString(><![CDATA[
)
// buf.WriteString(v)
// buf.WriteString(]]></
)
// buf.WriteString(k)
// buf.WriteString(>
)
// }
// buf.WriteString(</xml>
)
// return buf.String()
}