項目中調用第三方API,傳回格式是XML字元串,需要将XML反序列化為對象,格式如下:
1 <?xml version="1.0"?>
2 <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" totalCount="123" resultCode="ABC" resultMessage="測試">
3 <profile lastName="李" firstName="爽" dateOfBirth="XX0816" age="" gender="1" address="浙江省 杭州富陽市 東州工業園區3号路1号杭州龍盛工貿有限公" email="[email protected]" cellEmail="" socialMedia="" homePhone="" cellPhone="18857199925" contactabiltyMail="1" contactabiltyEmail="1" contactabiltyCellEmail="0" contactabiltyHomePhone="1" contactabiltyCellPhone="1" contactabiltyText="1" contactabiltySocialMedia="0" vipLevel="2" memberId="OC540C00016824" saAccount="660996" classa="小姐" homeStoreCode="OC54" />
4 <purchaseHistory>
5 <departmentPurchase totalLifeTimeSale="36791" totalTYAmount="21705" lastTxn="20160829" totalTYUnitCnt="9" firstTxn="20160713">
6 <department categoryName="D08" tyAmount="2970" tyUnitCnt="2" />
7 <department categoryName="D01" tyAmount="9750" tyUnitCnt="3" />
8 <department categoryName="D02" tyAmount="8985" tyUnitCnt="4" />
9 </departmentPurchase>
10 <ratePurchase totalLyAmount="0" totalLyRate="0" totalTyAmount="21705" totalTyRate="100" totalLifeTimeAmount="36791" totalLifeTimeRate="100">
11 <rate categoryName="Retail" lyAmount="" lyRate="0" lyToDate="0" tyAmount="21705" tyRate="100" tyToDate="21705" lifeTimeAmount="36791" lifeTimeRate="100" lyTyChange="100" />
12 </ratePurchase>
13 <storeRatePurchase>
14 <storeRate />
15 </storeRatePurchase>
16 </purchaseHistory>
17 <vipStatus issueDate="20140629" issueShop="OC54" ptsToUpgrade="21705" expiryDate="20170731" upgradeShop="" ptsToRenew="8130" />
18 <comments comment="第一場雪" />
19 </Response>
按照這個格式我需要定義相應的對象來接收,定義如下:
1 /// <summary>
2 ///
3 /// </summary>
4 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
5 [System.SerializableAttribute()]
6 [System.ComponentModel.DesignerCategoryAttribute("code")]
7 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false, ElementName = "Response")]
8 public class Response
9 {
10 [System.Xml.Serialization.XmlAttributeAttribute()]
11 public string totalCount { get; set; }
12
13 [System.Xml.Serialization.XmlAttributeAttribute()]
14 public string resultCode { get; set; }
15
16 [System.Xml.Serialization.XmlAttributeAttribute()]
17 public string resultMessage { get; set; }
18
19 [System.Xml.Serialization.XmlElementAttribute("profile", typeof(profile))]
20 public profile profile { get; set; }
21
22 [System.Xml.Serialization.XmlElementAttribute("purchaseHistory", typeof(purchaseHistory))]
23 public purchaseHistory purchaseHistory { get; set; }
24
25 [System.Xml.Serialization.XmlElementAttribute("vipStatus", typeof(vipStatus))]
26 public vipStatus vipStatus { get; set; }
27
28 [System.Xml.Serialization.XmlElementAttribute("comments", typeof(comments))]
29 public comments comments { get; set; }
30 }
31
32 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
33 [System.SerializableAttribute()]
34 [System.ComponentModel.DesignerCategoryAttribute("code")]
35 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
36 public class profile
37 {
38 [System.Xml.Serialization.XmlAttributeAttribute()]
39 public string lastName { get; set; }
40
41 [System.Xml.Serialization.XmlAttributeAttribute()]
42 public string firstName { get; set; }
43
44 [System.Xml.Serialization.XmlAttributeAttribute()]
45 public string dateOfBirth { get; set; }
46
47 [System.Xml.Serialization.XmlAttributeAttribute()]
48 public string age { get; set; }
49
50 [System.Xml.Serialization.XmlAttributeAttribute()]
51 public string gender { get; set; }
52
53 [System.Xml.Serialization.XmlAttributeAttribute()]
54 public string address { get; set; }
55
56 [System.Xml.Serialization.XmlAttributeAttribute()]
57 public string email { get; set; }
58
59 [System.Xml.Serialization.XmlAttributeAttribute()]
60 public string cellEmail { get; set; }
61
62 [System.Xml.Serialization.XmlAttributeAttribute()]
63 public string socialMedia { get; set; }
64
65 [System.Xml.Serialization.XmlAttributeAttribute()]
66 public string homePhone { get; set; }
67
68 [System.Xml.Serialization.XmlAttributeAttribute()]
69 public string cellPhone { get; set; }
70
71 [System.Xml.Serialization.XmlAttributeAttribute()]
72 public string contactabiltyMail { get; set; }
73
74 [System.Xml.Serialization.XmlAttributeAttribute()]
75 public string contactabiltyEmail { get; set; }
76
77 [System.Xml.Serialization.XmlAttributeAttribute()]
78 public string contactabiltyCellEmail { get; set; }
79
80 [System.Xml.Serialization.XmlAttributeAttribute()]
81 public string contactabiltyHomePhone { get; set; }
82
83 [System.Xml.Serialization.XmlAttributeAttribute()]
84 public string contactabiltyCellPhone { get; set; }
85
86 [System.Xml.Serialization.XmlAttributeAttribute()]
87 public string contactabiltyText { get; set; }
88
89 [System.Xml.Serialization.XmlAttributeAttribute()]
90 public string contactabiltySocialMedia { get; set; }
91
92 [System.Xml.Serialization.XmlAttributeAttribute()]
93 public string vipLevel { get; set; }
94
95 [System.Xml.Serialization.XmlAttributeAttribute()]
96 public string memberId { get; set; }
97
98 [System.Xml.Serialization.XmlAttributeAttribute()]
99 public string saAccount { get; set; }
100
101 [System.Xml.Serialization.XmlAttributeAttribute()]
102 public string classa { get; set; }
103
104 [System.Xml.Serialization.XmlAttributeAttribute()]
105 public string homeStoreCode { get; set; }
106 }
107
108 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
109 [System.SerializableAttribute()]
110 [System.ComponentModel.DesignerCategoryAttribute("code")]
111 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
112 public class purchaseHistory
113 {
114
115 [System.Xml.Serialization.XmlElementAttribute("departmentPurchase", typeof(departmentPurchase))]
116 public departmentPurchase departmentPurchase { get; set; }
117
118 [System.Xml.Serialization.XmlElementAttribute("ratePurchase", typeof(ratePurchase))]
119 public ratePurchase ratePurchase { get; set; }
120
121 [System.Xml.Serialization.XmlElementAttribute("storeRatePurchase", typeof(storeRatePurchase))]
122 public storeRatePurchase storeRatePurchase { get; set; }
123 }
124
125 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
126 [System.SerializableAttribute()]
127 [System.ComponentModel.DesignerCategoryAttribute("code")]
128 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
129 public class departmentPurchase
130 {
131 [System.Xml.Serialization.XmlAttributeAttribute()]
132 public string totalTYAmount { get; set; }
133
134 [System.Xml.Serialization.XmlAttributeAttribute()]
135 public string totalTYUnitCnt { get; set; }
136
137 [System.Xml.Serialization.XmlAttributeAttribute()]
138 public string firstTxn { get; set; }
139
140 [System.Xml.Serialization.XmlAttributeAttribute()]
141 public string lastTxn { get; set; }
142
143 [System.Xml.Serialization.XmlAttributeAttribute()]
144 public string totalLifeTimeSale { get; set; }
145
146 [System.Xml.Serialization.XmlElementAttribute("department", typeof(List<department>), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
147 public List<department> department { get; set; }
148 }
149
150 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
151 [System.SerializableAttribute()]
152 [System.ComponentModel.DesignerCategoryAttribute("code")]
153 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
154 public class department
155 {
156 [System.Xml.Serialization.XmlAttributeAttribute()]
157 public string categoryName { get; set; }
158
159 [System.Xml.Serialization.XmlAttributeAttribute()]
160 public string tyAmount { get; set; }
161
162 [System.Xml.Serialization.XmlAttributeAttribute()]
163 public string tyUnitCnt { get; set; }
164 }
165
166 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
167 [System.SerializableAttribute()]
168 [System.ComponentModel.DesignerCategoryAttribute("code")]
169 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
170 public class ratePurchase
171 {
172 [System.Xml.Serialization.XmlAttributeAttribute()]
173 public string totalLyAmount { get; set; }
174
175 [System.Xml.Serialization.XmlAttributeAttribute()]
176 public string totalLyRate { get; set; }
177
178 [System.Xml.Serialization.XmlAttributeAttribute()]
179 public string totalTyAmount { get; set; }
180
181 [System.Xml.Serialization.XmlAttributeAttribute()]
182 public string totalTyRate { get; set; }
183
184 [System.Xml.Serialization.XmlAttributeAttribute()]
185 public string totalLifeTimeAmount { get; set; }
186
187 [System.Xml.Serialization.XmlAttributeAttribute()]
188 public string totalLifeTimeRate { get; set; }
189
190 [System.Xml.Serialization.XmlElementAttribute("rate", typeof(rate))]
191 public rate rate { get; set; }
192 }
193
194 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
195 [System.SerializableAttribute()]
196 [System.ComponentModel.DesignerCategoryAttribute("code")]
197 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
198 public class rate
199 {
200 [System.Xml.Serialization.XmlAttributeAttribute()]
201 public string categoryName { get; set; }
202
203 [System.Xml.Serialization.XmlAttributeAttribute()]
204 public string lyAmount { get; set; }
205
206 [System.Xml.Serialization.XmlAttributeAttribute()]
207 public string lyRate { get; set; }
208
209 [System.Xml.Serialization.XmlAttributeAttribute()]
210 public string lyToDate { get; set; }
211
212 [System.Xml.Serialization.XmlAttributeAttribute()]
213 public string tyAmount { get; set; }
214
215 [System.Xml.Serialization.XmlAttributeAttribute()]
216 public string tyRate { get; set; }
217 [System.Xml.Serialization.XmlAttributeAttribute()]
218
219 public string tyToDate { get; set; }
220
221 [System.Xml.Serialization.XmlAttributeAttribute()]
222 public string lifeTimeAmount { get; set; }
223
224 [System.Xml.Serialization.XmlAttributeAttribute()]
225 public string lifeTimeRate { get; set; }
226
227 [System.Xml.Serialization.XmlAttributeAttribute()]
228 public string lyTyChange { get; set; }
229
230 }
231
232 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
233 [System.SerializableAttribute()]
234 [System.ComponentModel.DesignerCategoryAttribute("code")]
235 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
236 public class storeRatePurchase
237 {
238 public string storeRate { get; set; }
239 }
240
241 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
242 [System.SerializableAttribute()]
243 [System.ComponentModel.DesignerCategoryAttribute("code")]
244 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
245 public class vipStatus
246 {
247 [System.Xml.Serialization.XmlAttributeAttribute()]
248 public string issueDate { get; set; }
249
250 [System.Xml.Serialization.XmlAttributeAttribute()]
251 public string issueShop { get; set; }
252
253 [System.Xml.Serialization.XmlAttributeAttribute()]
254 public string ptsToUpgrade { get; set; }
255
256 [System.Xml.Serialization.XmlAttributeAttribute()]
257 public string expiryDate { get; set; }
258
259 [System.Xml.Serialization.XmlAttributeAttribute()]
260 public string upgradeShop { get; set; }
261
262 [System.Xml.Serialization.XmlAttributeAttribute()]
263 public string ptsToRenew { get; set; }
264 }
265
266 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
267 [System.SerializableAttribute()]
268 [System.ComponentModel.DesignerCategoryAttribute("code")]
269 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
270 public class comments
271 {
272 [System.Xml.Serialization.XmlAttributeAttribute()]
273 public string comment { get; set; }
274 }
View Code
解析代碼如下
1 private static System.Xml.Serialization.XmlSerializer Serializer;
2 /// <summary>
3 /// 指定XML字元串序列化成對象
4 /// </summary>
5 /// <typeparam name="T"></typeparam>
6 /// <param name="xml"></param>
7 /// <returns></returns>
8 public static T DeserializeForXml<T>(string xml) where T : class, new()
9 {
10 System.IO.StringReader stringReader = null;
11 try
12 {
13 Serializer = Serializer ?? new XmlSerializer(typeof(T));
14 stringReader = new StringReader(xml);
15 T result = Serializer.Deserialize(stringReader) as T;
16 return result;
17 }
18 finally
19 {
20 if ((stringReader != null))
21 {
22 stringReader.Dispose();
23 }
24 }
25 }
調用方式:
1 var rpXML = AcxiomXMLHelper.DeserializeForXml<CustomerDetails.Response>(returnXML);
好了,接下來就出現了問題
departmentPurchase 下面的department始終是沒有資料,調試好久都找不到問題出現在哪裡。
嘗試找解決的辦法,先執行個體化一個Response對象序列化後寫入檔案,再将檔案内容讀出來反序列化出來
1 Response response = new Response
2 {
3 totalCount = "123",
4 resultCode = "ABC",
5 resultMessage = "測試",
6 profile = new profile { lastName = "李", firstName = "爽", dateOfBirth = "XX0816", age = "", gender = "1", address = "浙江省 杭州富陽市 東州工業園區3号路1号杭州龍盛工貿有限公", email = "[email protected]", cellEmail = "", socialMedia = "", homePhone = "", cellPhone = "18857199925", contactabiltyMail = "1", contactabiltyEmail = "1", contactabiltyCellEmail = "0", contactabiltyHomePhone = "1", contactabiltyCellPhone = "1", contactabiltyText = "1", contactabiltySocialMedia = "0", vipLevel = "2", memberId = "OC540C00016824", saAccount = "660996", classa = "小姐", homeStoreCode = "OC54" },
7 comments = new comments { comment = "第一場雪" },
8 purchaseHistory = new purchaseHistory
9 {
10 departmentPurchase = new departmentPurchase
11 {
12 totalTYAmount = "21705",
13 totalTYUnitCnt = "9",
14 firstTxn = "20160713",
15 lastTxn = "20160829",
16 totalLifeTimeSale = "36791",
17 department = new List<department> {
18 new department { categoryName = "D08", tyAmount = "2970", tyUnitCnt = "2" },
19 new department { categoryName = "D01", tyAmount = "9750", tyUnitCnt = "3" },
20 new department { categoryName = "D02", tyAmount = "8985", tyUnitCnt = "4" }
21 }
22 },
23 ratePurchase = new ratePurchase
24 {
25 totalLyAmount = "0",
26 totalLyRate = "0",
27 totalTyAmount = "21705",
28 totalTyRate = "100",
29 totalLifeTimeAmount = "36791",
30 totalLifeTimeRate = "100",
31 rate = new rate { categoryName = "Retail", lyAmount = "", lyRate = "0", lyToDate = "0", tyAmount = "21705", tyRate = "100", tyToDate = "21705", lifeTimeAmount = "36791", lifeTimeRate = "100", lyTyChange = "100" }
32 },
33 storeRatePurchase = new storeRatePurchase { storeRate = string.Empty }
34 },
35 vipStatus = new vipStatus { issueDate = "20140629", issueShop = "OC54", ptsToUpgrade = "21705", expiryDate = "20170731", upgradeShop = "", ptsToRenew = "8130" }
36 };
37
38 FileStream stream = new FileStream(@"d:\xmlFormat.xml", FileMode.Create);
39 XmlSerializer xmlserilize = new XmlSerializer(typeof(Response));
40 xmlserilize.Serialize(stream, response); stream.Close();
41
42
43
44 using (FileStream xmlStream = new FileStream(@"d:\xmlFormat.xml", FileMode.Open))
45 {
46 using (XmlReader xmlReader = XmlReader.Create(xmlStream))
47 {
48 XmlSerializer serializer = new XmlSerializer(typeof(Response));
49 Response res = serializer.Deserialize(xmlReader) as Response;
50 }
51 }
代碼中res是反序列化的結果,資料都正确。這就有點惱火了,怎麼辦呢?
比較我生成的檔案和API傳回的XML:
下面是我生成的XML格式
1 <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" totalCount="123" resultCode="ABC" resultMessage="測試">
2 <profile lastName="李" firstName="爽" dateOfBirth="XX0816" age="" gender="1" address="浙江省 杭州富陽市 東州工業園區3号路1号杭州龍盛工貿有限公" email="[email protected]" cellEmail="" socialMedia="" homePhone="" cellPhone="18857199925" contactabiltyMail="1" contactabiltyEmail="1" contactabiltyCellEmail="0" contactabiltyHomePhone="1" contactabiltyCellPhone="1" contactabiltyText="1" contactabiltySocialMedia="0" vipLevel="2" memberId="OC540C00016824" saAccount="660996" classa="小姐" homeStoreCode="OC54" />
3 <purchaseHistory>
4 <departmentPurchase totalLifeTimeSale="36791" totalTYAmount="21705" lastTxn="20160829" totalTYUnitCnt="9" firstTxn="20160713">
5 <department>
6 <department categoryName="D08" tyAmount="2970" tyUnitCnt="2" />
7 <department categoryName="D01" tyAmount="9750" tyUnitCnt="3" />
8 <department categoryName="D02" tyAmount="8985" tyUnitCnt="4" />
9 </department>
10 </departmentPurchase>
11 <ratePurchase totalLyAmount="0" totalLyRate="0" totalTyAmount="21705" totalTyRate="100" totalLifeTimeAmount="36791" totalLifeTimeRate="100">
12 <rate categoryName="Retail" lyAmount="" lyRate="0" lyToDate="0" tyAmount="21705" tyRate="100" tyToDate="21705" lifeTimeAmount="36791" lifeTimeRate="100" lyTyChange="100" />
13 </ratePurchase>
14 <storeRatePurchase>
15 <storeRate />
16 </storeRatePurchase>
17 </purchaseHistory>
18 <vipStatus issueDate="20140629" issueShop="OC54" ptsToUpgrade="21705" expiryDate="20170731" upgradeShop="" ptsToRenew="8130" />
19 <comments comment="第一場雪" />
20 </Response>
仔細比對發現問題
在departmentPurchase 節點下我多了一層department節點,可我是按照接口的結果定義的對象啊
1 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34209")]
2 [System.SerializableAttribute()]
3 [System.ComponentModel.DesignerCategoryAttribute("code")]
4 [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)]
5 public class departmentPurchase
6 {
7 [System.Xml.Serialization.XmlAttributeAttribute()]
8 public string totalTYAmount { get; set; }
9
10 [System.Xml.Serialization.XmlAttributeAttribute()]
11 public string totalTYUnitCnt { get; set; }
12
13 [System.Xml.Serialization.XmlAttributeAttribute()]
14 public string firstTxn { get; set; }
15
16 [System.Xml.Serialization.XmlAttributeAttribute()]
17 public string lastTxn { get; set; }
18
19 [System.Xml.Serialization.XmlAttributeAttribute()]
20 public string totalLifeTimeSale { get; set; }
21
22 [System.Xml.Serialization.XmlElementAttribute("department", typeof(List<department>), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
23 public List<department> department { get; set; }
24 }
怎麼搞呢?在網上不停的找答案,最終都無解。但是沒有放棄,答案也往往在快要放棄的時候出現
我嘗試的修改了department的定義
修改前
1 [System.Xml.Serialization.XmlElementAttribute("department", typeof(List<department>), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
2 public List<department> department { get; set; }
修改後
1 [System.Xml.Serialization.XmlElementAttribute("department", typeof(department), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
2 public List<department> department { get; set; }
重新運作,奇迹出現
1 <?xml version="1.0"?>
2 <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" totalCount="123" resultCode="ABC" resultMessage="測試">
3 <profile lastName="李" firstName="爽" dateOfBirth="XX0816" age="" gender="1" address="浙江省 杭州富陽市 東州工業園區3号路1号杭州龍盛工貿有限公" email="[email protected]" cellEmail="" socialMedia="" homePhone="" cellPhone="18857199925" contactabiltyMail="1" contactabiltyEmail="1" contactabiltyCellEmail="0" contactabiltyHomePhone="1" contactabiltyCellPhone="1" contactabiltyText="1" contactabiltySocialMedia="0" vipLevel="2" memberId="OC540C00016824" saAccount="660996" classa="小姐" homeStoreCode="OC54" />
4 <purchaseHistory>
5 <departmentPurchase totalLifeTimeSale="36791" totalTYAmount="21705" lastTxn="20160829" totalTYUnitCnt="9" firstTxn="20160713">
6 <department categoryName="D08" tyAmount="2970" tyUnitCnt="2" />
7 <department categoryName="D01" tyAmount="9750" tyUnitCnt="3" />
8 <department categoryName="D02" tyAmount="8985" tyUnitCnt="4" />
9 </departmentPurchase>
10 <ratePurchase totalLyAmount="0" totalLyRate="0" totalTyAmount="21705" totalTyRate="100" totalLifeTimeAmount="36791" totalLifeTimeRate="100">
11 <rate categoryName="Retail" lyAmount="" lyRate="0" lyToDate="0" tyAmount="21705" tyRate="100" tyToDate="21705" lifeTimeAmount="36791" lifeTimeRate="100" lyTyChange="100" />
12 </ratePurchase>
13 <storeRatePurchase>
14 <storeRate />
15 </storeRatePurchase>
16 </purchaseHistory>
17 <vipStatus issueDate="20140629" issueShop="OC54" ptsToUpgrade="21705" expiryDate="20170731" upgradeShop="" ptsToRenew="8130" />
18 <comments comment="第一場雪" />
19 </Response>
問題解決。
原因就出在解析XML節點的
typeof(department) 與 typeof(List<department>)