有些时候我们在拼装XML的过程中,因为各种拼接会感到非常的麻烦(定义变量模型,自动生成,使用XElement再去组装),我的脑袋感觉都大了,能不能有个稍微比较快捷自动随变量自动生成XML格式的方式,看了网上大牛们的方式,还是老传统,不过代码很健壮耐用,我闲着没事也自己尝试能不能尽量在简化。
1:解析XML
解析的方式方法很多,但是我比较喜欢简单模式,通过系统缓存流进行读写操作(例如以下解析后存放到数据集Dataset中)
//系统内存提供流式的读写操作 var memoryStreams = new MemoryStream();
具体看以下方法(将数据带出后直接存到Dataset中)
//测试用例解析XML公共方法存放至Datatset数据集 public DataSet StringXml(string TestXml) { //系统内存提供流式的读写操作 var memoryStreams = new MemoryStream(); //注意格式化字符集 var buffer = Encoding.UTF8.GetBytes(TestXml); memoryStreams.Write(buffer, 0, buffer.Length); //设置讲readXml从0开始,不然错误提示XML缺少根元素 memoryStreams.Position = 0; memoryStreams.Seek(0, SeekOrigin.Begin); DataSet dsXml = new DataSet(); //将解析出来数组数据放进数据集并返回该数据集 dsXml.ReadXml(memoryStreams); return dsXml; }
2:组装XML
下面是我本地测试写的简单示例
public string GetXmlinfo() { DataSet dsXml = new DataSet(); dsXml = commonws.GetDsSql("个人中心", "根据证件ID查询信息"); string[] arryList = { "result" }; string result = docHelper.CreatXmlTree(arryList, dsXml); string state = "0"; string stateMessage = "交易成功"; #region XML组装(详细参数result节点) StringBuilder returnXml = new StringBuilder(); returnXml.Append("<?xml version="1.0" encoding="utf-8"?>"); returnXml.Append("<response>"); returnXml.Append("<resultCode>" + state + "</resultCode>"); returnXml.Append("<resultMessage>" + stateMessage + "</resultMessage>"); returnXml.Append(result); returnXml.Append("</response>"); #endregion return Getxml(returnXml.ToString()); }
以上代码除了固定的xml头,我们所拼接的其实是result内容节点,其他都是固定值,以及写死的固定参数值
其中:
CreatXmlTree是本次组装节点的重点
result是本次传入的节点名称,实际根据XML要求名称即可
string[] arryList = { "result" }; string result = docHelper.CreatXmlTree(arryList, dsXml);
CreatXmlTree组装方法展示如下:
/// <summary> /// </summary> /// <param name="Xmlparam">内容节点分支名称(以组的形式展示节点名称)</param> /// <param name="dsDataXml">数据集Dataset形式打开</param> /// <returns></returns> public string CreatXmlTree(object[] Xmlparam, DataSet dsDataXml) { DataTable dt = dsDataXml.Tables[0];//获取到表 string xmlt1 = Xmlparam[0].ToString();//外节点0 result 获取到节点内容名称 string Temo = string.Empty; string xmlAdd = string.Empty; XElement XEle = new XElement("XML");//实例化定义中必须要有值,后面可根据自己变量的传参为准 for (int j = 0; j < dsDataXml.Tables[0].Rows.Count; j++)//循环获取到数据行(与列名一一对应) { XEle = new XElement(xmlt1);//拼接节点元素开始 for (int i = 0; i < dsDataXml.Tables[0].Columns.Count; i++)//循环获取内容字段的列名 { string strRows = string.Empty;//测试 string strColumns = dsDataXml.Tables[0].Columns[i].ToString();//测试 try { strRows = dsDataXml.Tables[0].Rows[j][i].ToString(); //遍历后同时获取列名 + 每行首字段依次开始的值 } catch (Exception ex) { } XEle.Add( new XElement(strColumns, strRows)//组装XML ); } xmlAdd += XEle.ToString(); } return xmlAdd.ToString(); }
返回生成的XML节点展示(如下)
<?xml version="1.0" encoding="utf-8"?> <response> <resultCode>0</resultCode> <resultMessage>交易成功</resultMessage> <result> <patId>0000026723</patId> <patType></patType> <patName>曾金培</patName> <patSex>男</patSex> <patBirth>19550717</patBirth> <patAddress>和平</patAddress> <patMobile>18776580849</patMobile> <patCardType>居民身份证</patCardType> <patCardNo>000002672320200924</patCardNo> <admissionNo></admissionNo> </result> </response>
到此结束,再也不想再去拼装模型,一个个在拼装起来!大家可以尝试下,我会把源码分享出来,有什么不足的可供大家参考修改。