123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
-
-
- package encrypt
-
- import (
- "encoding/xml"
- "io"
- "regexp"
- )
-
-
-
-
- type XMLMap map[string]string
-
-
- type XMLElement struct {
- XMLName xml.Name
- Value string `xml:",chardata"`
- }
-
-
- type XMLCDATA struct {
- XMLName xml.Name
- Value string `xml:",cdata"`
- }
-
-
-
- func (m *XMLMap) UnmarshalXML(d *xml.Decoder, _ xml.StartElement) error {
- for {
- ele := XMLElement{}
- err := d.Decode(&ele)
- if err == io.EOF {
- break
- } else if err != nil {
- return err
- }
-
-
- (*m)[ele.XMLName.Local] = ele.Value
- }
-
- return nil
- }
-
-
-
- func (m *XMLMap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
- if m == nil || len(*m) == 0 {
- return nil
- }
-
- if start.Name.Local == "XMLMap" {
- start.Name.Local = "xml"
- }
-
- if err := e.EncodeToken(start); err != nil {
- return err
- }
-
- regx, err := regexp.Compile(`<!\[CDATA\[(.*)\]\]>`)
- if err != nil {
- return err
- }
-
- for k, v := range *m {
- res := regx.FindAllStringSubmatch(v, -1)
- if len(res) > 0 {
- t := XMLCDATA{
- XMLName: xml.Name{
- Space: "",
- Local: k,
- },
- Value: res[0][1],
- }
-
- if err := e.Encode(&t); err != nil {
- return err
- }
- } else {
- t := XMLElement{
- XMLName: xml.Name{
- Space: "",
- Local: k,
- },
- Value: v,
- }
-
- if err := e.Encode(&t); err != nil {
- return err
- }
- }
- }
-
- return e.EncodeToken(start.End())
- }
|