1. 程式人生 > >VS 2005 C#操作 XML 收藏

VS 2005 C#操作 XML 收藏

XML大家一定都很熟悉了,根據前一陣做專案總結出的經驗,寫一篇關於在VS 2005下操作XML的文章,語言使用C#
準備工作
要新增的名稱空間為 System.Xml  System.Xml.XPath
第一章 在記憶體裡建立Xml物件
有時候我們可能需要根據資料庫裡的資料值生成Xml檔案,那麼,我們就要在記憶體裡先建立Xml物件,之後再將Xml物件以字串或檔案的形式輸出。首先來看看怎麼用.Net下的類所提供的方法來生成Xml的各部分
假設一軟體商買如下游戲:文明3,帝國時代
那麼以下程式碼將生成如下的Xml文件

          <?xml version="1.0" encoding="utf-8" ?>
          <v:Games xmlns:v="www-shop-game">
              <v:Game name="文明3">
                  <Price>100</Price>
              </Game>
              <v:Game name="帝國時代">
                  <Price>200</Price>
              </Game>
          </Games>


 XmlDocument xml = new XmlDocument(); //建立XmlDomcument物件        
        XmlDeclaration Declaration = xml.CreateXmlDeclaration("1.0", "utf-8", null);    //Xml Declaration(Xml宣告)
        XmlNode RootNode = xml.CreateNode(XmlNodeType.Element,"v","Games","www-microsoft-game");
        xml.AppendChild(RootNode);
        XmlNode node1 = xml.CreateNode(XmlNodeType.Element, "v", "Game", "www-microsoft-game");
        RootNode.AppendChild(node1);
        node1.Attributes.Append(xml.CreateAttribute("name")).InnerText = "文明3";
        node1.AppendChild(xml.CreateNode(XmlNodeType.Element,"Price",null)).InnerText = "100";
        XmlNode node2 = xml.CreateNode(XmlNodeType.Element, "v", "Game", "www-microsoft-game");
        RootNode.AppendChild(node2);
        node2.Attributes.Append(xml.CreateAttribute("name")).InnerText = "帝國時代";
        node2.AppendChild(xml.CreateNode(XmlNodeType.Element, "Price", null)).InnerText = "300";
        xml.InsertBefore(Declaration, xml.DocumentElement);
         
以上雖是一個很簡單的Xml文件,但萬變不離其中,只要掌握了方法,再複雜的Xml串也可以拼出來。

 
第二章 讀取Xml文件的值
如果我們有現成的Xml文件,那麼,我們怎麼取到我們感興趣的值呢?還是以上邊的文件為例,我們看到根節點下邊有兩個節點,它們的名字都是Game,那麼用節點的名稱,我們是無法分辨出哪一個節點是“文明3”,哪一個節點是“帝國時代”的!!!那麼,當我想知道“文明3”的價格時,就應該使用Xml文件物件下的SelectSingleNode方法。這個方法有兩個過載的版本,一個是當Xml文件沒有名稱空間時使用的,一個引數SelectSingleNode(string xpath)直接傳入xpath即可另一個是當Xml文件有名稱空間時使用的,兩個引數SelelctSingleNode(string xpath,XmlNamespaceManager nsmgr),第一個引數還是xpath,第二個引數是XmlNamespaceManager物件,由於我們的Xml是有名稱空間的,所以我們要使用第二種方法!首先我們要建立一個XmlNamespaceManager物件,建立的方法為XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable);建立完物件後,我們就要開始為nsmgr增加我們的名稱空間了(注意,這裡加的名稱空間要與Xml實際的相對應,但前輟名可不同),增加的方法如下:nsmgr.AddNamespace("v","www-shop-game"),好了,準備工作完成了,現在可以使用SelectSingleNode方法了
string price = xml.SelectSingleNode("v:Games/v:Game[@name='文明3']/Price",nsmgr).InnerText
請注意,如果Xml文件裡沒有明確指出當前節點的名稱空間,那麼當前節點的名稱空間繼承其父節點的名稱空間
假設我們剛才生成的Xml文件已存在D:/Xml目錄下了,檔案的名字就叫sellgame.xml,完整的程式碼如下:

XmlDocument xml = new XmlDocument();
xml.Load("D://Xml//sellgame.xml")     
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable); //建立Xml名稱空間管理器物件
nsmgr.AddNamespace("v","www-shop-game");                            //增加名稱空間
string price = xml.SelectSingleNode("v:Games/v:Game[@name='文明3']/Price",nsmgr).InnerText;//取得相應的節點值   
       
現在,如果這家軟體經銷商加增加一種新的產品:文明3的典藏版!那麼我們的Xml文件就要進行相應的擴充了:

           <?xml version="1.0" encoding="utf-8" ?>
           <v:Games xmlns:v="www-shop-game">
               <v:Game name="文明3" type="standard">
                   <Price>100</Price>
               </Game>
               <v:Game name="文明3" type="classic">
                   <Price>500</Price>
               </Game>
               <v:Game name="帝國時代">
                   <Price>200</Price>
               </Game>
           </Games>

這時當我們想要取到全部與“文明3”有關的節點時,該如何進行呢?我們可以使用SelectNodes方法,該方法大體上與SelectSingleNode方法一樣,也是兩次過載,但此方法返回一個XmlNodeList物件,即一個XmlNode陣列
當我們想要取到全部與“文明3”有關的節點時,可以這樣:
 
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable);    //建立Xml名稱空間管理器物件
nsmgr.AddNamespace("v","www-shop-game");                        //增加名稱空間
XmlNodeList nodeList = xml.SelectNodes("v:Games/v:Game[@name='文明3']/Price",nsmgr);    //取得相應的節點陣列   


當我們要取節點的屬性值及節點的值時,都可以使用InnerText這個屬性
還有一個方法可以設定節點的屬生及節點的值