123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /**
- * Copyright (c) 2022 Yansen Zhang
- * wxcomponent is licensed under Mulan PSL v2.
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
- * You may obtain a copy of Mulan PSL v2 at:
- * http://license.coscl.org.cn/MulanPSL2
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
- * See the Mulan PSL v2 for more details.
- **/
-
- package encrypt
-
- import (
- "encoding/xml"
- "io"
- "regexp"
- )
-
- // 简易版本的 xml 解析, 实现将 单层 xml 解析到 map[string]string
-
- // XMLMap xml 转换 map
- type XMLMap map[string]string
-
- // XMLElement xml 转换 element
- type XMLElement struct {
- XMLName xml.Name
- Value string `xml:",chardata"`
- }
-
- // XMLCDATA xml 转换 cdata
- type XMLCDATA struct {
- XMLName xml.Name
- Value string `xml:",cdata"`
- }
-
- // UnmarshalXML xml.Unmarshaler 接口实现
- // 参考 https://stackoverflow.com/questions/30928770/marshall-map-to-xml-in-go
- 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
- }
-
- // 忽略 Space
- (*m)[ele.XMLName.Local] = ele.Value
- }
-
- return nil
- }
-
- // MarshalXML xml.Marshaler 接口实现
- // 参考 https://stackoverflow.com/questions/30928770/marshall-map-to-xml-in-go
- 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())
- }
|