C# – xml的操作

嗯…
C# 對 XML 的操作方式挺多樣的,實在不知道從何筆記
先從比較萬能的 XmlDocument 下手吧!

在使用 Xml 之前,一定要對他有所了解
我主要是看兩隻老虎提供的免費電子書學習的
下載「無廢話 XML」eBook

其實,大約去年12月左右就有找到這本eBook
可能功力不足,看得懵懵懂懂的,只看了一兩章就放棄了
(雖然現在還是不太夠XD)

因為要利用 xml 與用C++開發引擎的程式溝通,再一次翻出來看
嗯~現在看起來比較順暢了!
不過 HMTL 後面和 XSL 的部分還是消化不太了
我對 WEB 實在沒啥經驗

希望看倌對 xml 至少有一定的認識在看會比較好,不然應該會被我誤導XD

廢話完畢…進入正題



由於目前用途還不致於有名稱衝突的問題,為求簡潔,暫且不套用「命名空間(Namespace)
(在書中稱之為「名稱空間」,我是習慣叫它命名空間)

 <?xml version="1.0" encoding="UTF-16"?>
 <遊戲店>
         <軟體區>
             <軟體 name="幻想三國誌 4 外傳 精裝典藏版" price="1210" />
              <軟體 name="Photo Shop CS3 10.0 中文商業版" price="28900" />
              <軟體 name="瑪俐歐賽車 DS (NDS,日版)" price="1200" />
         </軟體區>

         <硬體區>
              <硬體>
                 <名稱>微星 9600GT 512M DDR3 公版卡</名稱>
                 <類型>顯示卡</類型>
                 <價格>4700</價格>
              </硬體>
         </硬體區>
         <周邊區 />
</遊戲店>

這是一個簡單的 xml 檔案內容

首先,先來創造一個最單純的 xml 空檔

 // 產生一個 XmlDocument
 XmlDocument XDoc = new XmlDocument();

 // 產生一個 XML宣告(Declaration)
 XmlDeclaration XDecl = XDoc.CreateXmlDeclaration("1.0", "UTF-16", null);

 // 將這個 XML宣告 加入整個檔案最前面
 XDoc.InsertBefore(XDecl, XDoc.DocumentElement);

 // 產生一個名為 遊戲店 的元素
 XmlElement XEle = XDoc.CreateElement("遊戲店");

 // 將之附加到檔案底下
 XDoc.AppendChild(XEle);

 // 儲存
 XDoc.Save("Test_CreateSampleXml.xml");

其中, DocumentElement 是指整個 xml 的根結點(root)
因為宣告(Declaration)一定放在檔最前面,故找出根節點,將之插入其前面
至於到底要不要加入宣告沒有硬性規定,通常還是標清楚比較安全

嗯~其他都如同字面上的意思!
如果沒錯誤,那麼輸出的 xml 內容應該像是…

 <?xml version="1.0" encoding="UTF-16"?>
<遊戲店 />

這檔案的根結點就是 <遊戲店> 了!



接著加入一些基本元素
至於寫法,主要分兩種…

 <軟體 name="幻想三國誌 4 外傳 精裝典藏版" price="1210" />

把物件屬性寫在「節點屬性」上,雖然看起來比較雜,但用 XmlDecument 會比較簡單

 <硬體>
     <名稱>微星 9600GT 512M DDR3 公版卡</名稱>
     <類型>顯示卡</類型>
     <價格>4700</價格>
 </硬體>

將物件屬性利用子節點的方式,附加在物件節點上
直接看起來這個比前者容易懂,但用
XmlDecument 相對較麻煩XD

事實上我還在這兩者中間掙扎
反正最後應該是會混搭!混在一起就對了!

我們先規畫三個區域,分別為軟體區硬體區周邊區
將它們放到 <遊戲店> 底下

 // 紀錄根節點的位置
 XmlNode XRoot = XDoc.SelectSingleNode("遊戲店");

 // 新增三個遊戲軟體的節點
 XmlElement XSubEle1 = XDoc.CreateElement("軟體區");
 XmlElement XSubEle2 = XDoc.CreateElement("硬體區");
 XmlElement XSubEle3 = XDoc.CreateElement("周邊區");

 // 附加上去
 XRoot.AppendChild(XSubEle1);
 XRoot.AppendChild(XSubEle2);
 XRoot.AppendChild(XSubEle3);

XmlNode SelectSingleNode( string xpath )
     回傳第一個符合 XPath 參數的子節點。

如果這時候輸出的話,應該是像這樣…

 <?xml version="1.0" encoding="UTF-16"?>
 <遊戲店>
     <軟體區 />
     <硬體區 />
     <周邊區 />
 </遊戲店>



分別使用上述兩種方式加入物件

 // 為 軟體區 增加一些遊戲
 // 取得 軟體區 的節點
 XmlNode XSub1Node = XRoot.SelectSingleNode("軟體區");

 // 產生遊戲
 XmlElement NewSoftware = XDoc.CreateElement("軟體");

 // 第一種加入節點屬性的方法
 XmlAttribute XAtt = XDoc.CreateAttribute("name");

 // 設
屬性值

 XAtt.Value = "幻想三國誌 4 外傳 精裝典藏版";

 // 附加上去
 NewSoftware.SetAttributeNode(XAtt);

 // 第二種加入節點屬性的方法
 NewSoftware.SetAttribute("price", "1210");

 // 將這個 遊戲 附加給 軟體區
 XSub1Node.AppendChild(NewSoftware);

 // 產生 硬體 給硬體區
 XmlNode XSub2Node = XRoot.SelectSingleNode("硬體區");
 XmlElement XSub2Sub = XDoc.CreateElement("硬體");
            
 // 產生名稱節點
 XmlElement XSub2SubName = XDoc.CreateElement("名稱");

 // 填上內容
 XSub2SubName.InnerText = "微星 9600GT 512M DDR3 公版卡";

 // 加入屬性
 XSub2Sub.AppendChild(XSub2SubName);

這時候輸出的話,應該是像這樣…

 <?xml version="1.0" encoding="UTF-16"?>
 <遊戲店>
     <軟體區>
         <軟體 name="幻想三國誌 4 外傳 精裝典藏版" price="1210" />
     </軟體區>

     <硬體區>
         <硬體>
             <名稱>微星 9600GT 512M DDR3 公版卡</名稱>
             <類型>顯示卡</類型>
             <價格>4700</價格>
         </硬體>
     </硬體區>

     <周邊區 />
 </遊戲店>

利用上面的程序,再多加幾個項目進去吧!



接著用一個簡單的方式來用程式檢閱剛才的成果

先在 Form 裡面拉出一個 DataGridView 控制項
接著…

 DataSet ds = new DataSet();
 ds.ReadXml(@"Test_CreateSubNode.xml");
 this.dataGridView1.DataSource = ds.Tables["軟體"];

這樣表單上就會列出所有符合節點名稱為 <軟體> 的項目了!



就先這樣吧
剩下改天再繼續~
總覺得好像打得太複雜了

— To be continue