gf/encoding/gxml/gxml.go

78 lines
1.9 KiB
Go
Raw Normal View History

// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
2018-01-19 15:26:28 +08:00
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
2018-01-19 15:26:28 +08:00
2019-01-15 23:27:47 +08:00
// Package gxml provides accessing and converting for XML content.
2018-01-19 15:26:28 +08:00
package gxml
import (
"fmt"
"strings"
2019-07-29 21:01:19 +08:00
"github.com/clbanning/mxj"
2019-07-29 21:01:19 +08:00
"github.com/gogf/gf/encoding/gcharset"
"github.com/gogf/gf/text/gregex"
2018-01-19 15:26:28 +08:00
)
2018-06-01 20:52:17 +08:00
// 将XML内容解析为map变量
func Decode(content []byte) (map[string]interface{}, error) {
res, err := convert(content)
if err != nil {
return nil, err
}
return mxj.NewMapXml(res)
2018-01-19 15:26:28 +08:00
}
// 将map变量解析为XML格式内容
func Encode(v map[string]interface{}, rootTag ...string) ([]byte, error) {
return mxj.Map(v).Xml(rootTag...)
}
func EncodeWithIndent(v map[string]interface{}, rootTag ...string) ([]byte, error) {
return mxj.Map(v).XmlIndent("", "\t", rootTag...)
2018-01-19 15:26:28 +08:00
}
2018-06-01 20:52:17 +08:00
// XML格式内容直接转换为JSON格式内容
func ToJson(content []byte) ([]byte, error) {
res, err := convert(content)
if err != nil {
fmt.Println("convert error. ", err)
return nil, err
}
mv, err := mxj.NewMapXml(res)
2018-06-01 20:52:17 +08:00
if err == nil {
return mv.Json()
} else {
return nil, err
}
}
// XML字符集预处理
func convert(xml []byte) (res []byte, err error) {
patten := `<\?xml.*encoding\s*=\s*['|"](.*?)['|"].*\?>`
matchStr, err := gregex.MatchString(patten, string(xml))
if err != nil {
return nil, err
}
xmlEncode := "UTF-8"
if len(matchStr) == 2 {
xmlEncode = matchStr[1]
}
xmlEncode = strings.ToUpper(xmlEncode)
2019-06-19 09:06:52 +08:00
res, err = gregex.Replace(patten, []byte(""), xml)
if err != nil {
return nil, err
}
if xmlEncode != "UTF-8" && xmlEncode != "UTF8" {
dst, err := gcharset.Convert("UTF-8", xmlEncode, string(res))
if err != nil {
return nil, err
}
res = []byte(dst)
}
return res, nil
}