Your Federal Quarterly Tax Payments are due April 15th Get Help Now >>

Data Representation 1 by malj

VIEWS: 9 PAGES: 30

									     Chapter 19
    讀寫XML文件




1
    19.1 XML簡介
   XML 是 eXtensible Markup Language 的縮寫,是一種可
    擴展標記的語言。
   是由全球資訊網路協會,將SGML的格式精簡後所制定
    出來新的標準,可以用來定義一種新的標記語言。
   所謂 SGML (Standard Generalized Markup Language)是
    一種允許你指定文件結構的語言
   SGML文件可以轉成 HTML、PostScript、LaTex t 等多種
    格式輸出,同時為方便管理和維護,SMGL 提供所有
    文件一致外觀,文件以 SMGL 格式存檔,不因軟體差
    異而有亂碼出現。
隨網際網路流行,網路上傳輸資料量暴增與資料愈
 來愈複雜化,在網路上使用 HTML 已顯捉襟見肘,
2若能將XML 和 HTML 相互配合就能解決這些問題。
   XML 是由 SMGL 精簡而來,主要目的是為能讓 SGML
    也能在網路上使用,以彌補 HTML 的不完美。
   由於 XML可對標籤(Tag)、屬性名稱自訂範圍,允許
    你創造新的標記。XML 所有文件是由 ASCII 碼以
    及 ”<” 、 ”>” 標記所組成。
   如:<title>WelCome My Page</title>;由於XML著重
    在解析資料,無法設計出美麗網頁,但 XML 文件資料
    轉換效率相當高。
   如:使用 XML 所製作的電子文件可交給 Word或Execl
    應用軟體解讀,也可交給 IE 瀏覽器解譯。
   所以 XML 將成為未來電子商務文件的主流。
   以下是 XML 簡單介紹:

3
   XML文件的宣告
   XML文件的最開頭必須加上宣告敘述。
   語法:<?xml version=”1.0” encoding=”BIG5”?>
   功能:將該份文件宣告成XML格式。
     <?:表示指令的開始。
     xml:宣告該份文件為XML文件,必須注意的是
            xml要 用小寫表示之。
     version:為XML文件的版本,version=”1.0” 表示目前
     文件為XML 1.0版,必須要用小寫來表示。
     encoding:設定XML文件的語系,encoding=”BIG5”
     表示XML文件的語系以中文的大五碼來編碼,屬性
     encoding必須要小寫。
     ?>表示指令的結束。
4
5
3. 成對的控制標記
    XML文件控制標記大多是成對出現,例如
    <title>WellCome My Page</title>。
4. 非成對控制標記
    若是使用非成對的控制標記,必須在該控制標記後加上 ”/”,
    例如:非成對標記<Name>標記,在XML文件中必須寫成<Name/>。
5. XML標記的命名
    XML文件標記大小寫視為不同。例如<Name>標記不同於<name>。
6. 屬性值必須使用雙引號括住
    在XML文件控制標記中的屬性值,必須以 ”” 括住,
    例如:<title align=”center”>歡迎光臨</title>。
7. XML檔案的命名
    XML 文件必須以附檔名 *.xml 來存檔。


6
Step 1 撰寫XML文件,並以 PERSON.xml 命名
       開啟記事本,請鍵入下列的XML文件,再將XML文件以 PERSON.xml
        為檔名儲存到D磁碟機下。
       若不想建立 PERSON.xml,將光碟ch19資料夾的 PERSON.xml
        複製到D磁碟機下。
     <?xml version="1.0" encoding="big5"?>
     <person>
       <student>
          <id_no>9096036</id_no>
          <name>蔡文龍</name>
          <tel>04-32345671</tel>
          <mail>lung67@giga.net.tw</mail>
       </student>
       <student>
         <id_no>9096001</id_no>
        <name>許百宏</name>
        <tel>04-12345671</tel>
        <mail>em@ms37.hient.net</mail>
7     </student>
    </person>
【說明】
 以下敘述宣告該份文件為XML文件,並支援Big5中文碼。
  <?xml version="1.0" encoding="big5"?>
 XML標記一般都稱為元素(element)或節點(node)。例如:
  <name>元素。
 一份正確 XML 文件只能有一個根元素,上列 XML文件
  是由<person>標記開始,而由</person>標記結束。
  所以此份 XML 文件的根元素為<person>。
 若一個元素再包含其他元素,則此元素稱為父元素,
  而被包含的元素則稱為子元素。例如:
  <person>為<student>的父元素
  <student>為<person>的子元素
  <student>為<id_no>、<name>、<tel>、<mail>的父元素
  <id_no>、<name>、<tel>、<mail>為<student>的子元素
  以此類推…。
8
Step 2
 瀏覽XML文件
 請開啟瀏覽器,並在下圖 網址(D) 處鍵入:\Person.xml」
 出現 PERSON.xml 文件如下圖:




9
19.2 讀寫XML文件
19.2.1 如何讀取XML文件中的記錄資料
Step 1 建立DataSet物件
         DataSet^ myDataSet = gcnew DataSet() ;
Step 2
     使用 DataSet 物件的 ReadXml 方法取得 XML 文件所有
     的記錄資料,此時DataSet物件之DataTable物件會有XML
     文件所有的記錄。ReadXml方法必須指定XML文件所在之
     真實路徑
         myDataSet->ReadXml(“XML文件檔案真實路徑”) ;

10
Step 3
   將取得的資料(DataSet中的DataTable)指定給
  DataGridView控制項的DataSource屬性,此時
  DataGridView控制項即會顯示XML文件之所有
  記錄資料。
dataGridView1->DataSource = myDataSet->Tables["DataTable物件名稱"] ;




11
12
 Step 1
  新增一個 Windows 應用程式專案,其專案命名為
  「ReadXml」,記得將專案進行存檔。
  接著再將書附光碟ch19資料夾下的Person.xml 資料庫
  複製到你的電腦D:\VC2005\ch19 資料夾下,然後再
  將Person.xml的唯讀屬性取消。
 Step 2
 在表單放置一個DataGridView控制項,其物件名稱為
  「dataGridView1」。
 Step 3
  撰寫如下程式碼:




13
01 String^ filename; //宣告全域變數filename, 用來存放Person.xml路徑
02
03 Void ShowPerson()
04 {
05 DataSet^ myDataSet = gcnew DataSet();
06 myDataSet->ReadXml(filename);
07 dataGridView1->DataSource = myDataSet->Tables ["student"];
08 }
09
10 private: System::Void Form1_Load(System::Object^ sender,
11 System::EventArgs^ e) {
12 filename = "D:\\VC2005\\ch19\\Person.xml";
13 ShowPerson();
14 }


14
19.2.2 如何在XML文件中新增、刪除、修改記錄資料

    DataSet物件的WriteXml方法可將記憶體中更新完成(新增、修改、
     刪除)的DataSet物件寫回指定的XML文件中,接著我們就來說明
     如何透過DataSet的操作在指定的XML文件中新增、刪除、修改一
     筆記錄資料。
一. 如何在XML文件中新增一筆記錄
Step 1
     建立DataSet物件:
     DataSet^ myDataSet = gcnew DataSet() ;
Step 2
     使用DataSet物件的ReadXml方法取得XML文件所有的記錄資料,
     此時DataSet物件內的DataTable物件會有XML文件所有的記錄。
     ReadXml方法必須指定XML文件所在之真實路徑:
     myDataSet->ReadXml(“XML文件檔案真實路徑”) ;
15
Step 3
   使用DataTable物件的NewRow方法建立一個新的
   DataRow物件,DataRow物件就是資料表中的一筆記錄。
     DataRow^ myRow= myDataSet->Tables["DataTable物件"]->NewRow() ;
Step 4
 設定DataRow物件所有欄位之資料:
   myRow["id_no"] = “9096036” ;
   myRow["name"] = “蔡文龍”;
   myRow["tel"] = “04-1236598” ;
   myRow["mail"] = “lung67@giga.net.tw“;




16
Step 5
   使用DataTable 物件中 Rows 集合的 Add方法將 DataRow
    物件新增到 DataTable 物件中,此時 DataTable 物件中
    就會新增一筆記錄並置於最後面。
     myDataSet->Tables["student"]->Rows->Add(myRow);
Step 6
   使用DataSet物件的 WriteXml 方法可將 DataSet 物件中的
    資料寫回指定的 XML 文件檔中。
     myDataSet->WriteXml(“XML文件檔案真實路徑”);




17
    二. 如何在XML文件中刪除一筆記錄
    若要刪除XML文件中的記錄資料,可以透過DataTable物件
     中DataRow物件的Delete方法刪除一筆資料,然後再使用
     WriteXml方法將DataSet資料寫回XML文件檔。其步驟如下。
     Step 1
    建立DataSet物件,並使用DataSet物件的ReadXml方法取得
     XML文件檔內所有的記錄資料,此時DataSet物件內的
     DataTable物件會有XML文件所有的記錄。ReadXml方法必
     須指定XML文件所在之真實路徑。
    DataSet^ myDataSet = gcnew DataSet();
    myDataSet->ReadXml(“XML文件檔案真實路徑”);



18
Step 2
 使用DataRow的Delete方法刪除第i筆資料。
     myDataSet->Tables["student"]->Rows[i]->Delete();Step 3
    使用DataSet物件的WriteXml方法可將DataSet物件中的資
     料寫回指定的XML文件。此行程式表示將更新完成的
     DataSet物件,使用WriteXml方法寫回指定的XML文件。
myDataSet->WriteXml(“XML文件檔案真實路徑”);
【完整程式區段】
 DataSet^ myDataSet = gcnew DataSet();
     myDataSet->ReadXml(“XML文件檔案真實路徑”);
     myDataSet->Tables["student"]->Rows[i]->Delete();
     myDataSet->WriteXml(“XML文件檔案真實路徑”) ;


19
    三. 如何在XML文件中修改一筆記錄
     若要修改XML文件中的記錄資料,可先修改記憶體中
     DataSet 物件的 DataTable 物件各個記錄資料,然後再
     使用 DataSet 物件的 WriteXml 方法將修改後的 DataSet
     寫回指定 XML 文件中即可,其步驟如下:
    Step 1
     建立 DataSet 物件,並使用 DataSet 物件的 ReadXml
     方法取得 XML 文件所有的記錄資料,此時 DataSet
     物件內的DataTable物件會有XML文件所有的記錄。
     ReadXml方法必須指定XML文件所在之真實路徑。
     (參考下面程式片段1)



20
   Step 2
    使用重複結構逐一判斷DataTable物件中是否有要修改
    之記錄資料,若成立則修改 DataTable 物件中指定記錄
    資料。
    下面程式逐一判斷 DataTable 物件的 Rows[i][0](id_no欄位)
    是否有 ”9096036”這筆記錄資料?
    若有該筆資料,將
    Rows[i][1](name欄位)設為 ”蔡文龍”
    Rows[i][2](tel欄位) 設為 ”04-12365478”
    Rows[i][3](mail欄位)設為 lung67@giga.net.tw
    最後再透過 DataSet 物件的 WriteXml方法將修改後的
    DataSet 寫回指定的XML文件中並結束重覆結構。
    (參考下面程式片段2)


21
22
23
24
25
01 String^ filename; //宣告全域變數filename, 用來存放Person.xml路徑
02
03 Void ShowPerson()
04 {
05 DataSet^ myDataSet = gcnew DataSet();
06 myDataSet->ReadXml(filename);
07 dataGridView1->DataSource = myDataSet->Tables["student"];
08 }
09 //-------------------------------------------------------
10 private: System::Void Form1_Load(System::Object^ sender,
11 System::EventArgs^ e) {
12 filename = "D:\\VC2005\\ch19\\Person.xml";
13 ShowPerson();
14 }
15 //-------------------------------------------------------

26
17 System::EventArgs^ e) {
18 DataSet^ myDataSet = gcnew DataSet();
19 myDataSet->ReadXml(filename);
20 bool writeData = true;
21 for (int i = 0; i < myDataSet->Tables["student"]->Rows->Count; i++)
22 {
23      if(txtId ->Text ==
24          myDataSet ->Tables ["student"]->Rows [i][0]->ToString ())
25      {
26          writeData = false;
27                 MessageBox::Show
28             ("學號重複,XML文件已經有此筆記錄!!");
29          break;
30      }
31 }


27
32 if (writeData )
33 {
34       DataRow^ myRow = myDataSet->Tables["student"]->NewRow();
35       myRow["id_no"] = txtId->Text;
36       myRow["name"] = txtName->Text;
37       myRow["tel"] = txtTel->Text;
38       myRow["mail"] = txtMail->Text;
39       myDataSet->Tables["student"]->Rows->Add(myRow);
40       myDataSet->WriteXml(filename);
41       MessageBox::Show ("學號" + txtId->Text +
42            "這筆記錄已經新增完成!!");
43 }
44 dataGridView1->DataSource = myDataSet->Tables["student"];
45 }
46 //-------------------------------------------------------


28
47 private: System::Void btnUpdate_Click(System::Object^ sender,
48 System::EventArgs^ e) {
49     DataSet^ myDataSet = gcnew DataSet();
50     myDataSet->ReadXml(filename);
51 for (int i = 0; i < myDataSet->Tables["student"]->Rows->Count; i++)
52 {
53       if (txtId->Text ==
54            myDataSet->Tables["student"]->Rows[i][0]->ToString())
55       {
56           myDataSet->Tables["student"]->Rows[i][1] = txtName->Text;
57           myDataSet->Tables["student"]->Rows[i][2] = txtTel->Text;
58           myDataSet->Tables["student"]->Rows[i][3] = txtMail->Text;
59           myDataSet->WriteXml(filename);
60                       MessageBox::Show("學號" + txtId->Text +
61               "這筆記錄已經修改完成!!");
62           break;
63       }
64 }
65 dataGridView1->DataSource = myDataSet->Tables["student"];
66 }
67 //-------------------------------------------------------


29
68 private: System::Void btnDel_Click(System::Object^ sender,
69 System::EventArgs^ e) {
70 DataSet^ myDataSet = gcnew DataSet();
71 myDataSet->ReadXml(filename);
72 for (int i = 0; i < myDataSet->Tables["student"]->Rows->Count; i++)
73 {
74       if (txtId->Text ==
75           myDataSet->Tables["student"]->Rows[i][0]->ToString())
76       {
77           myDataSet->Tables["student"]->Rows[i]->Delete();
78           myDataSet->WriteXml(filename);
79            MessageBox::Show("學號" + txtId->Text +
80                          "這筆記錄已經刪除完成!!");
81           break;
82       }
83     }
84 dataGridView1->DataSource = myDataSet->Tables["student"];
85 }

30

								
To top