tysk/pkg/func.go

85 lines
2.3 KiB
Go

package pkg
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"gitea.cdlsxd.cn/self-tools/tysk/constant"
"strings"
)
// XmlRequest 定义请求结构
type XmlRequest struct {
Action constant.RequestCode `xml:"action"`
UserName string `xml:"userName"`
ExtraFields map[string]interface{} `xml:"-"` // 忽略此字段,手动处理
}
// MarshalToXML 将XmlRequest转换为指定格式的XML字节流
func (req XmlRequest) MarshalToXML() ([]byte, error) {
var buf bytes.Buffer
// 写入XML声明
buf.WriteString(`<?xml version="1.0" encoding="GBK"?>` + "\n")
buf.WriteString("<stream>\n")
// 写入基本字段
buf.WriteString(fmt.Sprintf("<action>%s</action>\n", req.Action))
buf.WriteString(fmt.Sprintf("<userName>%s</userName>\n", req.UserName))
// 处理ExtraFields
for key, value := range req.ExtraFields {
switch v := value.(type) {
case string:
// 空字符串特殊处理(根据示例输出,有些空字段也需要输出)
buf.WriteString(fmt.Sprintf("<%s>%s</%s>\n", key, v, key))
case []map[string]interface{}:
// 处理列表数据
buf.WriteString(fmt.Sprintf("<list name=\"%s\">\n", key))
for _, row := range v {
buf.WriteString("<row>\n")
for rowKey, rowValue := range row {
buf.WriteString(fmt.Sprintf("<%s>%v</%s>\n", rowKey, rowValue, rowKey))
}
buf.WriteString("</row>\n")
}
buf.WriteString("</list>\n")
// 可以根据需要添加其他类型的处理
case []string:
// 处理列表数据
buf.WriteString(fmt.Sprintf("<list name=\"%s\">\n", key))
buf.WriteString("<row>\n")
for _, row := range v {
}
buf.WriteString("</row>\n")
buf.WriteString("</list>\n")
// 可以根据需要添加其他类型的处理
}
}
buf.WriteString("</stream>")
return buf.Bytes(), nil
}
func XMLToByte(xmlData string) ([]byte, error) {
// 1. 定义一个通用接口来存储解析后的XML
var data interface{}
// 2. 使用xml.Unmarshal解析XML
decoder := xml.NewDecoder(strings.NewReader(xmlData))
err := decoder.Decode(&data)
if err != nil {
return nil, fmt.Errorf("xml decode error: %v", err)
}
// 3. 将解析后的数据转换为JSON
jsonData, err := json.Marshal(data)
if err != nil {
return nil, fmt.Errorf("json encode error: %v", err)
}
return jsonData, nil
}