C# 引用System.Xml.Serialization 操作XML格式数据。现在好多接口对接都是XML格式的报文,所以拼接XML不美观,且不容易维护。
可以通过访问https://www.toolscat.com/convert/xml-csharp 快速转换XML实体
实体类
/// <summary>
/// 公用域 请求报文
/// </summary>
[XmlRoot("Transaction")]
public class RequestMessage
{
/// <summary>
/// 公用域请求头
/// </summary>
[XmlElement("Transaction_Header")]
public RequestMessage_Header RequestMessage_Header { get; set; }
/// <summary>
/// 公用域 请求体
/// </summary>
[XmlElement("Transaction_Body")]
public RequestMessage_Body RequestMessage_Body { get; set; }
}
/// <summary>
/// 公用域 请求报文头
/// </summary>
public class RequestMessage_Header
{
/// <summary>
/// 服务名 必填 签到P1OPME001
/// </summary>
[XmlElement("SYS_TX_CODE")]
public string ServiceCode { get; set; }
/// <summary>
/// 应用报文长度 定长10位,不充 10位前面充0
/// </summary>
[XmlElement("SYS_MSG_LEN")]
public string MessageLength { get; set; }
/// <summary>
/// 发起方交易时间
/// </summary>
[XmlElement("SYS_REQ_TIME")]
public string RequstTime { get; set; }
/// <summary>
/// 服务版本号 当前为:01
/// </summary>
[XmlElement("SYS_TX_VRSN")]
public string ServiceVersion { get; set; } = "<![CDATA[01]]>";
/// <summary>
/// 交易日期
/// </summary>
[XmlElement("TXN_DT")]
public string TransactionDate { get; set; } = $"<![CDATA[{DateTime.Now.ToString("yyMMdd")}]]>";
/// <summary>
/// 交易时间
/// </summary>
[XmlElement("TXN_TM")]
public string TransactionTime { get; set; } = $"<![CDATA[{DateTime.Now.ToString("hhmmsss")}]]>";
/// <summary>
/// 交易人员编号
/// </summary>
[XmlElement("TXN_STFF_ID")]
public string TranPersonCode { get; set; }
/// <summary>
/// 多实体标识
/// </summary>
[XmlElement("MULTI_TENANCY_ID")]
public string MulitLanguage { get; set; } = "<![CDATA[CN000]]>";
/// <summary>
/// 语言标识
/// </summary>
[XmlElement("LNG_ID")]
public string LanguageIdenti { get; set; } = "<![CDATA[zh-cn]]>";
/// <summary>
/// 多页查询每页笔数 分页查询时使用
/// </summary>
[XmlElement("REC_IN_PAGE")]
public string PageTotal { get; set; }
/// <summary>
/// 多页查询跳转页码 分页查询时使用
/// </summary>
[XmlElement("PAGE_JUMP")]
public string PageJumpSize { get; set; }
/// <summary>
/// 状态跟踪号
/// </summary>
[XmlElement("STS_TRACE_ID")]
public string StatusTraceCode { get; set; }
/// <summary>
/// 电子银行合约编号
/// </summary>
[XmlElement("CHNL_CUST_NO")]
public string BankChnlCustNo { get; set; }
/// <summary>
/// 发起方流水号
/// </summary>
[XmlElement("IttParty_Jrnl_No")]
public string InitiateSerialNumber { get; set; }
/// <summary>
/// 交易发起方IP地址
/// </summary>
[XmlElement("Txn_Itt_IP_Adr")]
public string CounterPartyAdr { get; set; }
}
/// <summary>
/// 请求报文体
/// </summary>
public class RequestMessage_Body
{
[XmlElement("request")]
public Body_Request Body_Request { get; set; }
}
/// <summary>
/// 请求报文体
/// </summary>
public class Body_Request
{
/// <summary>
/// 开始日期 数据格式:yyyyMMdd
/// </summary>
[XmlElement("StDt")]
public string BeginDate { get; set; } = $"<![CDATA[{DateTime.Now:yyMMdd}]]>";
/// <summary>
/// 开始时间 数据格式:HHmmss
/// </summary>
[XmlElement("StTm")]
public string BeginTime { get; set; } = $"<![CDATA[{DateTime.Now:hhmmsss}]]>";
}
XML序列化和反序列化
/// <summary>
///反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T DeserializeObject<T>(string xml, string nameSpace = "") where T : class
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;//这一句表示忽略xml声明
settings.Indent = true;
settings.Encoding = Encoding.UTF8;
using (StringReader sr = new StringReader(xml))
{
using (XmlTextReader xr = new XmlTextReader(sr))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(xr);
}
}
}
/// <summary>
///XML序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="serialObject"></param>
/// <returns></returns>
public static string XmlSerializer<T>(T serialObject) where T : class
{
var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
var serializer = new XmlSerializer(serialObject.GetType());
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = false;
settings.Encoding = new UTF8Encoding(false);
MemoryStream stream = new MemoryStream();
using (var writer = XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, serialObject, emptyNamepsaces);
}
return settings.Encoding.GetString(stream.ToArray());
}
建行需要对内容格式转换帮助类
/// <summary>
/// 格式化数据 因为银行的数据必须要包含
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string SetFormatValue(this string value)
{
var str = string.Format("<![CDATA[{0}]]>", value);
return str;
}
XML序列化
RequestMessage_Header theader = new RequestMessage_Header();
RequestMessage_Body tbody = new RequestMessage_Body();
Body_Request body_Request = new Body_Request();
body_Request.BeginDate = DateTime.Now.ToString("yyyMMdd").SetFormatValue();
body_Request.BeginTime = DateTime.Now.ToString("hhmmsss").SetFormatValue();
tbody.Body_Request = body_Request;
RequestMessage t = new RequestMessage();
t.RequestMessage_Body = tbody;
t.RequestMessage_Header = theader;
var xmls = Xml.XmlUtil.XmlSerializer(t).Replace("<", "<").Replace(">", ">");
XML反序列化
var xmlstr = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Transaction><Transaction_Header><SYS_TX_CODE><![CDATA[P1CMSET35]]></SYS_TX_CODE><SYS_MSG_LEN><![CDATA[0000500000]]></SYS_MSG_LEN><SYS_REQ_TIME><![CDATA[20210903083608695]]></SYS_REQ_TIME><SYS_TX_VRSN><![CDATA[01]]></SYS_TX_VRSN><TXN_DT><![CDATA[20210903]]></TXN_DT><TXN_TM><![CDATA[083608]]></TXN_TM><TXN_STFF_ID><![CDATA[]]></TXN_STFF_ID><MULTI_TENANCY_ID><![CDATA[CN000]]></MULTI_TENANCY_ID><LNG_ID><![CDATA[zh-cn]]></LNG_ID><REC_IN_PAGE></REC_IN_PAGE><PAGE_JUMP></PAGE_JUMP><STS_TRACE_ID></STS_TRACE_ID><CHNL_CUST_NO><![CDATA[]]></CHNL_CUST_NO><IttParty_Jrnl_No></IttParty_Jrnl_No><Txn_Itt_IP_Adr><![CDATA[60.208.111.207]]></Txn_Itt_IP_Adr></Transaction_Header><Transaction_Body><request><ASPD_ECD><![CDATA[]]></ASPD_ECD><SChl_No><![CDATA[]]></SChl_No><FwCtl_Node_ID><![CDATA[]]></FwCtl_Node_ID><IttParty_Bsn_Dt><![CDATA[20210903]]></IttParty_Bsn_Dt><Grp_ID><![CDATA[]]></Grp_ID><Cst_ID><![CDATA[]]></Cst_ID><Prim_AR_No><![CDATA[]]></Prim_AR_No><Root_Node_PdAr_ID><![CDATA[]]></Root_Node_PdAr_ID><PdAr_ID><![CDATA[]]></PdAr_ID><SvM24Hr_Ind><![CDATA[]]></SvM24Hr_Ind><Tmzon_ECD><![CDATA[]]></Tmzon_ECD><Rqs_Upload_File_Nm><![CDATA[]]></Rqs_Upload_File_Nm><Cmpt_Ent_ID><![CDATA[]]></Cmpt_Ent_ID><WF_BIZ_ID><![CDATA[]]></WF_BIZ_ID><WF_MNPLT_TP><![CDATA[]]></WF_MNPLT_TP><WF_FCN_ID><![CDATA[]]></WF_FCN_ID><CCstTr_ID><![CDATA[CMN0007800092]]></CCstTr_ID><CCstTrNdID><![CDATA[]]></CCstTrNdID><Rule_Chk_Ind_1><![CDATA[]]></Rule_Chk_Ind_1><Cmpt_Rltv_Jrnl_No><![CDATA[]]></Cmpt_Rltv_Jrnl_No><CstPty_TxnSrlNo><![CDATA[]]></CstPty_TxnSrlNo><Pyr_DpBkNm><![CDATA[]]></Pyr_DpBkNm><Pyr_DepBnk_No><![CDATA[]]></Pyr_DepBnk_No><Pyr_BnkCD><![CDATA[]]></Pyr_BnkCD><Pyr_BkCgyCd><![CDATA[01]]></Pyr_BkCgyCd><Pyr_Cst_AccNo><![CDATA[37001646244050147436]]></Pyr_Cst_AccNo><Pyr_AccNm><![CDATA[公司三一]]></Pyr_AccNm><Pyr_Acc_CgyCd><![CDATA[]]></Pyr_Acc_CgyCd><Pyr_Adr><![CDATA[]]></Pyr_Adr><RcvPrt_CCstTr_ID><![CDATA[]]></RcvPrt_CCstTr_ID><RcvPrt_CCstTrNdID><![CDATA[]]></RcvPrt_CCstTrNdID><RcvPrt_DpBkNm><![CDATA[中国建设银行股份有限公司昌乐支行]]></RcvPrt_DpBkNm><RcvPrt_DepBnk_No><![CDATA[]]></RcvPrt_DepBnk_No><RcvPrt_BnkCD><![CDATA[]]></RcvPrt_BnkCD><RcvPrt_BkCgyCd><![CDATA[01]]></RcvPrt_BkCgyCd><RcvPrt_Cst_AccNo><![CDATA[]]></RcvPrt_Cst_AccNo><RcvPtAc_Nm><![CDATA[公司六二]]></RcvPtAc_Nm><RcvPtAc_CgyCd><![CDATA[02]]></RcvPtAc_CgyCd><RcvPrt_Adr><![CDATA[山东坊市]]></RcvPrt_Adr><Rqs_Amt><![CDATA[1.00]]></Rqs_Amt><Urgnt_TpCd><![CDATA[01]]></Urgnt_TpCd><Use_Nm><![CDATA[平台付款建行银企连付款测试]]></Use_Nm><CshMgt_Use_ID><![CDATA[]]></CshMgt_Use_ID><Rmrk><![CDATA[平台付款建行银企直连付款测试]]></Rmrk><RvPy_Bdgt_Use_ID></RvPy_Bdgt_Use_ID><RvPy_Bdgt_Use_Nm></RvPy_Bdgt_Use_Nm><Trgr_Amt></Trgr_Amt><Csz_Txn_Nm></Csz_Txn_Nm><Py_Cnd_TpCd><![CDATA[00]]></Py_Cnd_TpCd><STBal_Val></STBal_Val><Scl_Fctr></Scl_Fctr><Roud_NbrOfBit></Roud_NbrOfBit><RvPy_ExMd_Cd><![CDATA[0]]></RvPy_ExMd_Cd><Rsrvtn_Exec_Dt></Rsrvtn_Exec_Dt><Rsrvtn_Exec_Tm></Rsrvtn_Exec_Tm><Frq_MtdCd></Frq_MtdCd><FxFrq_Exec_Dt_Dsc></FxFrq_Exec_Dt_Dsc><Prsz_Inf_1></Prsz_Inf_1><Prsz_Inf_2></Prsz_Inf_2><Prsz_Inf_3></Prsz_Inf_3><Prsz_Inf_4></Prsz_Inf_4><Prsz_Inf_5></Prsz_Inf_5><Prsz_Inf_6></Prsz_Inf_6><Prsz_Inf_7></Prsz_Inf_7><Prsz_Inf_8></Prsz_Inf_8><Prsz_Inf_9></Prsz_Inf_9><Prsz_Inf_10></Prsz_Inf_10><Prsz_Inf_Nm_1></Prsz_Inf_Nm_1><Prsz_Inf_Nm_2></Prsz_Inf_Nm_2><Prsz_Inf_Nm_3></Prsz_Inf_Nm_3><Prsz_Inf_Nm_4></Prsz_Inf_Nm_4><Prsz_Inf_Nm_5></Prsz_Inf_Nm_5><Prsz_Inf_Nm_6></Prsz_Inf_Nm_6><Prsz_Inf_Nm_7></Prsz_Inf_Nm_7><Prsz_Inf_Nm_8></Prsz_Inf_Nm_8><Prsz_Inf_Nm_9></Prsz_Inf_Nm_9><Prsz_Inf_Nm_10></Prsz_Inf_Nm_10><Doc_Inf></Doc_Inf><Cst_Dlv_Dt><![CDATA[20210903]]></Cst_Dlv_Dt><Cst_Dlv_Tm><![CDATA[083608695]]></Cst_Dlv_Tm><Cst_Csz_Dt></Cst_Csz_Dt><Cst_Csz_Tm></Cst_Csz_Tm><Rsrv_Fld_1></Rsrv_Fld_1><Rsrv_Fld_2></Rsrv_Fld_2><Rsrv_Fld_3></Rsrv_Fld_3><Rsrv_Fld_4></Rsrv_Fld_4><Rsrv_Fld_5></Rsrv_Fld_5><Rsrv_Fld_6></Rsrv_Fld_6><Rsrv_Fld_7></Rsrv_Fld_7><Rsrv_Fld_8></Rsrv_Fld_8><Rsrv_Fld_9></Rsrv_Fld_9><Rsrv_Fld_10></Rsrv_Fld_10><CCBS_Fee_Sbj_Cd></CCBS_Fee_Sbj_Cd><Cst_RecAmt></Cst_RecAmt><Ahn_Py_Agrm_No></Ahn_Py_Agrm_No><Pyr_AccNm_Verf_Cd></Pyr_AccNm_Verf_Cd><RcvPrt_AccNm_Verf_Cd></RcvPrt_AccNm_Verf_Cd><Cst_MblPh_No></Cst_MblPh_No><SMS_Cntnt></SMS_Cntnt><Email_Adr></Email_Adr><Mail_CntDsc></Mail_CntDsc><CstPty_Py_Jrnl_No><![CDATA[2021090300000040]]></CstPty_Py_Jrnl_No></request></Transaction_Body></Transaction>";
var tsdd = Xml.XmlUtil.DeserializeObject<ResponseMessage>(xmlstr);