1.xml保存
private readonly string XMLSavePath = Path.Combine(Environment.CurrentDirectory, "XML", GlobalParam.Today);
public LogicalService()
{
// 创建XML日志保存目录
if (!Directory.Exists(XMLSavePath)) Directory.CreateDirectory(XMLSavePath);
}
#region 保存交互的XML /// <summary> /// 保存XML交互数据 /// </summary> /// <param name="xml">json</param> /// <param name="fileName">保存名称</param> /// <param name="inOrOut">输入还是输入json</param> private void SaveInteractiveXMLData(string xml, string fileName, bool inOrOut) { if(GlobalParam.Params.SaveInteractiveXMLData == "1") { // 拼接完整文件名 if(inOrOut) fileName = Path.Combine(XMLSavePath, $"{fileName}_In.xml"); else fileName = Path.Combine(XMLSavePath, $"{fileName}_Out.xml"); // 创建文件并保存 if (File.Exists(fileName)) File.Delete(fileName); using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { byte[] bytes = Encoding.Default.GetBytes(xml); fs.Write(bytes, 0, bytes.Length); } } } #endregion
2.拼接XML案例
#region 获取上传用XML文件 private string GetXML(StudentSignUploadInfo entity, int djc) { StringBuilder sb = new StringBuilder(); sb.Append("<?xml version="1.0" encoding="GBK"?>"); // 根节点 sb.Append("<drvexam>"); // 流水号 sb.Append("<lsh>").Append(entity.Lsh).Append("</lsh>"); // 考场代码 sb.Append("<kcdm>").Append(entity.Kcdm).Append("</kcdm>"); // 考试科目 sb.Append("<kskm>").Append(entity.Kskm).Append("</kskm>"); // 身份证明号码 sb.Append("<sfzmhm>").Append(entity.Sfzmhm).Append("</sfzmhm>"); // 培训驾校简称 sb.Append("<jxjc>").Append(entity.Jxmc).Append("</jxjc>"); // 考试日期 sb.Append("<ksrq>").Append(entity.Ksrq).Append("</ksrq>"); // 预约次数 sb.Append("<yycs>").Append(entity.Yycs).Append("</yycs>"); // 考试车号 sb.Append("<ksch>").Append(entity.Kcbh).Append("</ksch>"); // 考试员签名 sb.Append("<ksyqm>").Append(entity.Kgqmzp).Append("</ksyqm>"); // 考生签名 sb.Append("<ksqm>").Append(entity.Ksqmzp).Append("</ksqm>"); // 人证(门禁)照片 sb.Append("<rzzp>").Append(entity.Rzzp).Append("</rzzp>"); #region 第一次 if (djc == 1) { // 本次预约考试次数 sb.Append("<bcyykscs>").Append(1).Append("</bcyykscs>"); // 考试开始时间 sb.Append("<kssj>").Append(entity.Kssj1).Append("</kssj>"); // 考试结束时间 sb.Append("<jssj>").Append(entity.Jssj1).Append("</jssj>"); // 考试成绩 sb.Append("<kscj>").Append(entity.Jgfs1).Append("</kscj>"); // 扣分项 sb.Append("<kfx>").Append(entity.Kfxx1).Append("</kfx>"); // 考试过程照片1 sb.Append("<gczp1>").Append(entity.Zp1_1).Append("</gczp1>"); // 照片拍摄时间1 sb.Append("<pssj1>").Append(entity.Zp1sj_1).Append("</pssj1>"); // 考试过程照片2 sb.Append("<gczp2>").Append(entity.Zp2_1).Append("</gczp2>"); // 照片拍摄时间2 sb.Append("<pssj2>").Append(entity.Zp2sj_1).Append("</pssj2>"); // 考试过程照片3 sb.Append("<gczp3>").Append(entity.Zp3_1).Append("</gczp3>"); // 照片拍摄时间3 sb.Append("<pssj3>").Append(entity.Zp3sj_1).Append("</pssj3>"); } #endregion #region 第二次 else { // 本次预约考试次数 sb.Append("<bcyykscs>").Append(2).Append("</bcyykscs>"); // 考试开始时间 sb.Append("<kssj>").Append(entity.Kssj2).Append("</kssj>"); // 考试结束时间 sb.Append("<jssj>").Append(entity.Jssj2).Append("</jssj>"); // 考试成绩 sb.Append("<kscj>").Append(entity.Jgfs2).Append("</kscj>"); // 扣分项 sb.Append("<kfx>").Append(entity.Kfxx2).Append("</kfx>"); // 考试过程照片1 sb.Append("<gczp1>").Append(entity.Zp1_2).Append("</gczp1>"); // 照片拍摄时间1 sb.Append("<pssj1>").Append(entity.Zp1sj_2).Append("</pssj1>"); // 考试过程照片2 sb.Append("<gczp2>").Append(entity.Zp2_2).Append("</gczp2>"); // 照片拍摄时间2 sb.Append("<pssj2>").Append(entity.Zp2sj_2).Append("</pssj2>"); // 考试过程照片3 sb.Append("<gczp3>").Append(entity.Zp3_2).Append("</gczp3>"); // 照片拍摄时间3 sb.Append("<pssj3>").Append(entity.Zp3sj_2).Append("</pssj3>"); } #endregion sb.Append("</drvexam>"); return sb.ToString(); } #endregion
3.上传XML
#region[构建请求,获取数据] private bool UploadXML(string xml, out string message) { bool result = true; message = string.Empty; try { HttpWebRequest request = null; request = WebRequest.Create(GlobalParam.Params.RemoteWebServiceUrl) as HttpWebRequest; request.Method = "POST"; request.ContentType = "application/xml"; using (Stream requestStream = request.GetRequestStream()) { using (StreamWriter sw = new StreamWriter(requestStream, Encoding.GetEncoding("GBK"))) { sw.Write(xml); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (Stream responseStream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(responseStream)) { message = sr.ReadToEnd(); } } } catch (Exception ex) { log4NetUtil.Error("UploadXML", ex); message = $"{ex.Message}"; result = false; } return result; } #endregion
4.调用参考
// 生成XML string xml = this.GetXML(entity, 2); // 保存输入XML this.SaveInteractiveXMLData(xml, $"{entity.Xm}_{entity.Sfzmhm}_2", true); // 上传 bool result = UploadXML(xml, out xml); if (result) { if (!string.IsNullOrEmpty(xml)) { // 保存输出XML this.SaveInteractiveXMLData(xml, $"{entity.Xm}_{entity.Sfzmhm}_2", false); // 解析XML XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xml); XmlNode node = xmlDoc.SelectSingleNode("/result"); string code = node.Attributes["code"].Value; string message = node.Attributes["message"].Value; // 成功 if (code == "1") { this.SaveSignUploadResultToDB(entity, true); entity.KL_sign_upload_2 = 1; entity.UploadMessage_2 = message; } // 失败 else { entity.UploadMessage_2 = $"上传失败:{code}_{message}"; SoundPlayerUtils.PlaySound(); return; } } else { entity.UploadMessage_2 = $"调用上传接口无返回"; return; } } else { entity.UploadMessage_2 = $"调用上传接口失败:{xml}"; return; }