gf/g/encoding/gxml/gxml.go

76 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"
"github.com/gogf/gf/g/text/gregex"
"github.com/gogf/gf/third/github.com/axgle/mahonia"
"github.com/gogf/gf/third/github.com/clbanning/mxj"
"strings"
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]
}
s := mahonia.GetCharset(xmlEncode)
if s == nil {
return nil, fmt.Errorf("not support charset:%s\n", xmlEncode)
}
res, err = gregex.Replace(patten, []byte(""), xml)
if err != nil {
return nil, err
}
if !strings.EqualFold(s.Name, "UTF-8") {
res = []byte(s.NewDecoder().ConvertString(string(res)))
}
return res, nil
}