有些時候我們在拼裝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>
到此結束,再也不想再去拼裝模型,一個個在拼裝起來!大家可以嘗試下,我會把原始碼分享出來,有什麼不足的可供大家參考修改。