Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

XmlToMap方法有Bug,我是这样修改的 #16

Open
jay-wlj opened this issue Jun 11, 2019 · 0 comments
Open

XmlToMap方法有Bug,我是这样修改的 #16

jay-wlj opened this issue Jun 11, 2019 · 0 comments

Comments

@jay-wlj
Copy link

jay-wlj commented Jun 11, 2019

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), &params)
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()

}

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant