2010年10月22日 星期五

在 Visual C# 2010 用 DATASET 讀取 XML 檔案

  今天又有新的需求進來,客戶希望能在 XML 檔中 存取一些公司的基本定義資料及設定資料庫的路徑,這樣子程式在一開啟的時候可以先詢問客戶要處理哪一家公司的資料,應該是想用同一個系統處理多家公司的資料,而每一家公司的資料是放在單獨的資料庫裡。

  XML 的檔案格式如下:

<? xml version="1.0" encoding="big5"?>
<公司集合>
<公司>
  <名稱>輕鬆工作家股份有限公司</名稱>
  <統一編號>00000000</統一編號>
  <資料庫>c:\database\00000000.mdf</資料庫>
</公司>
</公司集合>

  但一開始給使用者的檔安希望是一個由程式產生的XML 檔如下:


<? xml version="1.0" encoding="big5"?>
</公司集合>


  程式片段如下:

 XmlDocument xmlDoc = new XmlDocument();
                         XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "big5", null);
                         XmlElement rootNode = xmlDoc.CreateElement("公司集合");
                         xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement);
                         xmlDoc.AppendChild(rootNode);
                         xmlDoc.Save(XmlFile); // Xmlfile 是xml 檔的絕對路徑檔名



  因為想用 Dataset 來處理 XML ,我假設DATASET 在 Read XML 檔後,應該把 "公司集合" 當成是 DATASET 的名稱,測試一下:


                DataSet ds = new DataSet();
                try
                {
                    ds.ReadXml(XmlFile); // Xmlfile 是xml 檔的絕對路徑檔名
                }
                catch (Exception e1)
                {
                    MessageBox.Show("XML檔案錯誤\n"+  e1.Message);
                    Application.Exit();
                }
                 MessageBox.Show(ds.DataSetName,"DataSetName");


 果然得到以下的結果:

   這樣子 DATASET 應該會把<公司> 當成是 Table 名稱,<名稱><統一編號> 當成是欄位(column) 名稱,測試一下:


                        DataTable dt = new DataTable();
                        DataColumn dc1 = new DataColumn();
                        dt.TableName = "公司";
                        dc1.ColumnName = "名稱";
                        dc1.DataType = System.Type.GetType("System.String");
                        ds.Tables.Add(dt); //Dataset 中加入新 Table
                        dt.Columns.Add(dc1); // Tables 中加入新的 column
                        DataRow dr = ds.Tables["公司"].NewRow();
                        dr["名稱"] = "輕鬆工作家股份有限公司";
                        dt.Rows.Add(dr); // table 中加入一筆資料
                        ds.WriteXml(XmlFile, XmlWriteMode.IgnoreSchema);
結果 XML 檔;


<?xml version="1.0" standalone="yes"?>
<公司集合>
  <公司>
    <名稱>輕鬆工作家股份有限公司</名稱>
  </公司>
</公司集合>

一切看起來 ok, 但是美中不足的是 XML 的第一行變成是 <?xml version="1.0" standalone="yes"?> , Google 一下 找不到 DATASET 中去更改成 <? xml version="1.0" encoding="big5"?> ,只好再次讀入修改:


                        XmlDocument xmlDoc = new System.Xml.XmlDocument();
                        xmlDoc.Load(XmlFile); // Xmlfile 是xml 檔的絕對路徑檔名
                        XmlDeclaration xmlDeclaration = (XmlDeclaration) xmlDoc.FirstChild;
                        xmlDeclaration.Encoding = "big5";
                        xmlDeclaration.Standalone = "";
                        xmlDoc.Save(XmlFile); // Xmlfile 是xml 檔的絕對路徑檔名



完成


<?xml version="1.0" encoding="big5"?>
<公司集合>
  <公司>
    <名稱>輕鬆工作家股份有限公司</名稱>
  </公司>
</公司集合>