1. 程式人生 > >DataTable讀寫到XML檔案的正確方法(以及對缺少根元素問題的處理)

DataTable讀寫到XML檔案的正確方法(以及對缺少根元素問題的處理)

    有時候需要將DataTable資料儲存到xml檔案中,在不使用資料庫的小程式中、在需要通過網路介面傳引數時,經常會有這種需要,操作不好,會出現“缺少根元素”。現在將經過反覆測試沒有錯誤的讀寫兩個方法寫出來,大家可以修改使用。

    寫datatable到XML

       public static bool dataTable2EncXml(DataTable dt, string strFilePath)
        {
            try
            {                
                string strMid = "";
                MemoryStream ms = new MemoryStream();
                StreamWriter sw = new StreamWriter(ms,System.Text.Encoding.UTF8);
                dt.WriteXml(sw,XmlWriteMode.WriteSchema); //必須寫入架構,即沒有行資料時,也寫入列等架構內容,否則,沒有行資料時,列資料也會丟失
                
                ms.Position = 0;//復位讀取位置
                StreamReader sr = new StreamReader(ms, System.Text.Encoding.UTF8);
                strMid = sr.ReadToEnd();
                sr.Close();
                sw.Close();
                ms.Close();
                strMid = Encrypting(strMid);//加密
               if( WriteToFile(strFilePath, strMid) == -1) return false; //一個簡單的寫文字檔案 的小函式
               else   return true;
            }
            catch
            {
                return false;
            }
        }



    讀XML到datatable,不會提示缺少根元素


        /// <summary>
        /// 將Xml加密資料讀入DataTable
        /// </summary>
        /// <param name="filePath">加密XML檔案路徑</param>
        public static DataTable Xml2DecDataTable(string filePath)
        {
            string strMid = ReadFromFile(filePath); //一個簡單的讀文字檔案函式
            strMid = Decrypting(strMid); //解密
           
            //先將XML字串讀到xmlDocument中
            XmlDocument xd = new XmlDocument();
            xd.LoadXml(strMid);
           
            //再存入記憶體流
            MemoryStream ms = new MemoryStream();
            xd.Save(ms);
            ms.Seek(0, SeekOrigin.Begin);


            //datatable就可以正確讀取了,不會顯示“缺少根元素”
            DataTable dt = new DataTable();
            try
            {
                dt.ReadXml(ms);
            }
            catch (Exception ex) { }
            
            ms.Dispose();
            return dt;
        }