XML節點自動生成簡單實例

有些時候我們在拼裝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>

到此結束,再也不想再去拼裝模型,一個個在拼裝起來!大家可以嘗試下,我會把源碼分享出來,有什麼不足的可供大家參考修改。

 

Tags: