...
杨前锦
2025-06-11 10e84968f9c70ebf6c83893091a36863b1e27b2a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
 
using HH.WCS.Mobox3.Template.device;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Text;
using System.Web.Http;
using System.Xml;
using System.Xml.Linq;
using static HH.WCS.Mobox3.Template.api.ApiHelper;
using static HH.WCS.Mobox3.Template.api.ApiModel;
using static HH.WCS.Mobox3.Template.api.OtherModel;
using static HH.WCS.Mobox3.Template.device.S7Helper;
 
namespace HH.WCS.Mobox3.Template.api {
    /// <summary>
    /// 测试用,如果项目中要和设备对接,前期设备无法测试,用接口模拟
    /// </summary>
    [RoutePrefix("api")]
    public class TestController : System.Web.Http.ApiController {
 
 
        //如果好用,请收藏地址,帮忙分享。
        public class HEAD {
            /// <summary>
            /// 唯一标识
            /// </summary>
            public string KEY { get; set; }
            /// <summary>
            /// 过账日期
            /// </summary>
            public string GZRQ { get; set; }
            /// <summary>
            /// 过账人员
            /// </summary>
            public string GZRY { get; set; }
            /// <summary>
            /// 工厂
            /// </summary>
            public string GC { get; set; }
        }
 
        public class ITEM1 {
            /// <summary>
            /// 序列号
            /// </summary>
            public string XLH { get; set; }
        }
 
        public class ITEM {
            /// <summary>
            /// 物料凭证编号
            /// </summary>
            public string WLPZBH { get; set; }
            /// <summary>
            /// 物料凭证年度
            /// </summary>
            public string WLPZND { get; set; }
            /// <summary>
            /// 物料凭证中的项目
            /// </summary>
            public string WLPZZDXM { get; set; }
            /// <summary>
            /// 物料号
            /// </summary>
            public string WLH { get; set; }
            /// <summary>
            /// 基本计量单位
            /// </summary>
            public string JBJLDW { get; set; }
            /// <summary>
            /// 数量
            /// </summary>
            public string SL { get; set; }
            /// <summary>
            /// 采购凭证号
            /// </summary>
            public string CGPZH { get; set; }
            /// <summary>
            /// 采购凭证项目编号
            /// </summary>
            public string CGPZXMBH { get; set; }
            /// <summary>
            /// 库存地点
            /// </summary>
            public string KCDD { get; set; }
            /// <summary>
            /// 检验批编号
            /// </summary>
            public string JYPBH { get; set; }
            /// <summary>
            /// 会计凭证输入日期
            /// </summary>
            public string KJPZSSRQ { get; set; }
            /// <summary>
            /// 会计凭证输入时间
            /// </summary>
            public string KJPZSRSJ { get; set; }
            /// <summary>
            /// 批次
            /// </summary>
            public string PC { get; set; }
            /// <summary>
            /// 
            /// </summary>
            public List<ITEM1> ITEM1 { get; set; }
        }
 
        public class WLPZ {
            /// <summary>
            /// 
            /// </summary>
            public HEAD HEAD { get; set; }
            /// <summary>
            /// 
            /// </summary>
            public List<ITEM> ITEM { get; set; }
        }
 
        public class ROOT {
            /// <summary>
            /// 
            /// </summary>
            public WLPZ WLPZ { get; set; }
        }
 
        public class Root {
            /// <summary>
            /// 
            /// </summary>
            public ROOT ROOT { get; set; }
        }
 
        /*<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <WLPZ>
        <HEAD>
            <KEY>唯一标识</KEY>
            <GZRQ>过账日期</GZRQ>
            <GZRY>过账人员</GZRY>
            <GC>工厂</GC>
        </HEAD>
        <ITEM>
            <WLPZBH>物料凭证编号</WLPZBH>
            <WLPZND>物料凭证年度</WLPZND>
            <WLPZZDXM>物料凭证中的项目</WLPZZDXM>
            <WLH>物料号</WLH>
            <JBJLDW>基本计量单位</JBJLDW>
            <SL>数量</SL>
            <CGPZH>采购凭证号</CGPZH>
            <CGPZXMBH>采购凭证项目编号</CGPZXMBH>
            <KCDD>库存地点</KCDD>
            <JYPBH>检验批编号</JYPBH>
            <KJPZSSRQ>会计凭证输入日期</KJPZSSRQ>
            <KJPZSRSJ>会计凭证输入时间</KJPZSRSJ>
            <PC>批次</PC>
            <ITEM1>
                <XLH>序列号</XLH>
            </ITEM1>
        </ITEM>
    </WLPZ>
</ROOT>*/
        static void ProcessXmlElements(XmlNode parentNode) {
            if (parentNode.HasChildNodes) {
                // 用于存储 ITEM 和 ITEM1 元素
                XmlNodeList itemNodes = parentNode.SelectNodes("ITEM | ITEM1");
                if (itemNodes.Count > 0) {
                    // 创建一个新的父节点来容纳 ITEM 和 ITEM1 数组
                    XmlElement arrayElement = parentNode.OwnerDocument.CreateElement(itemNodes[0].Name + "Array");
                    foreach (XmlNode itemNode in itemNodes) {
                        // 将 ITEM 和 ITEM1 元素移动到新的数组父节点下
                        arrayElement.AppendChild(itemNode.CloneNode(true));
                        parentNode.RemoveChild(itemNode);
                    }
                    // 将新的数组父节点添加到原父节点中
                    parentNode.AppendChild(arrayElement);
                }
 
                // 递归处理子节点
                foreach (XmlNode childNode in parentNode.ChildNodes) {
                    if (childNode.NodeType == XmlNodeType.Element) {
                        ProcessXmlElements(childNode);
                    }
                }
            }
        }
        static void EnsureArrayFormat(JObject json) {
            foreach (var property in json.Properties()) {
                if (property.Name == "ITEM" || property.Name == "ITEM1") {
                    if (property.Value is JObject && !(property.Value is JArray)) {
                        // 若为单个对象,包装成数组
                        property.Value = new JArray(property.Value);
                    }
                }
                if (property.Value is JObject) {
                    // 递归处理子对象
                    EnsureArrayFormat((JObject)property.Value);
                }
                else if (property.Value is JArray) {
                    // 递归处理数组中的每个元素
                    foreach (var item in (JArray)property.Value) {
                        if (item is JObject) {
                            EnsureArrayFormat((JObject)item);
                        }
                    }
                }
            }
        }
 
        [HttpPost]
        public IHttpActionResult PostXml([FromBody] XElement xmlRequest) {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xmlRequest.ToString());
            // 将 XmlDocument 转换为 JSON 字符串
            JObject jsonObject = JsonConvert.DeserializeObject<JObject>(JsonConvert.SerializeXmlNode(xmlDoc));
            // 处理特定字段,强制转换为数组
            EnsureArrayFormat(jsonObject);
            // 反序列化为RootWithArray
            var data = JsonConvert.DeserializeObject<Root>(jsonObject.ToString());
 
 
            //string json = JsonConvert.SerializeXmlNode(xmlDoc, Newtonsoft.Json.Formatting.Indented);
            //var data1 = JsonConvert.DeserializeObject<Root>(json);
 
 
 
            // 处理SAP XML请求逻辑
            var responseXml = new XElement("Response",
                new XElement("Status", "Success"),
                new XElement("Message", "XML processed")
            );
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(content: responseXml.ToString(), encoding: Encoding.UTF8, mediaType: "application/xml"  // 关键:声明内容类型
            )
            };
            //return response;
 
            //return Request.CreateResponse(HttpStatusCode.OK, responseXml);
            return Ok(responseXml);
        }
 
 
        [HttpGet]
        public HttpResponseMessage GetXml(string id) {
            // 根据ID返回XML数据
            var xmlData = $@"
            <Data>
                <ID>{id}</ID>
                <Value>Sample Data</Value>
            </Data>";
            //string xml = JsonConvert.DeserializeXmlNode(json, "root").OuterXml;
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(xmlData.ToString(), Encoding.UTF8, "application/xml")
            };
            //return Content(HttpStatusCode.OK, xmlData, Configuration.Formatters.XmlFormatter);
            return response;
        }
 
        [HttpGet]
        public HttpResponseMessage GetXml1(string id) {
            // json转xml返回
 
            var json = JsonConvert.SerializeObject(new { id = 123, name = "jack" });
            string xml = JsonConvert.DeserializeXmlNode(json, "root").OuterXml;
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(xml, Encoding.UTF8, "application/xml")
            };
            return response;
        }
    }
 
 
}