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(`` + "\n") buf.WriteString("\n") // 写入基本字段 buf.WriteString(fmt.Sprintf("%s\n", req.Action)) buf.WriteString(fmt.Sprintf("%s\n", req.UserName)) // 处理ExtraFields for key, value := range req.ExtraFields { switch v := value.(type) { case string: // 空字符串特殊处理(根据示例输出,有些空字段也需要输出) buf.WriteString(fmt.Sprintf("<%s>%s\n", key, v, key)) case []map[string]interface{}: // 处理列表数据 buf.WriteString(fmt.Sprintf("\n", key)) for _, row := range v { buf.WriteString("\n") for rowKey, rowValue := range row { buf.WriteString(fmt.Sprintf("<%s>%v\n", rowKey, rowValue, rowKey)) } buf.WriteString("\n") } buf.WriteString("\n") // 可以根据需要添加其他类型的处理 case []string: // 处理列表数据 buf.WriteString(fmt.Sprintf("\n", key)) buf.WriteString("\n") for _, row := range v { } buf.WriteString("\n") buf.WriteString("\n") // 可以根据需要添加其他类型的处理 } } buf.WriteString("") 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 }