51 lines
1.4 KiB
Go
51 lines
1.4 KiB
Go
package pkg
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// XmlRequest 定义请求结构
|
|
type XmlRequest struct {
|
|
Action string `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")
|
|
// 可以根据需要添加其他类型的处理
|
|
}
|
|
}
|
|
|
|
buf.WriteString("</stream>")
|
|
return buf.Bytes(), nil
|
|
}
|