C# 用Linq的方式實現對Xml文件的基本操作(創建xml文件、增刪改查xml文件節點信息)



本文的主要模塊爲:

    ① :生成xml文件

    ② :遍歷xml文件的節點信息

    ③ :修改xml文件的節點信息

    ④ :向xml文件添加節點信息

    ⑤ :刪除指定xml文件的節點信息


  ①:生成xml文件假設我們想生成這樣的一個xml文件結構,如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
-    <Users>
-     <User ID="111111">
        <name>EricSun</name>
        <password>123456</password>
        <description>Hello I'm from Dalian</description>
      </User>
-     <User ID="222222">
        <name>Ray</name>
        <password>654321</password>
        <description>Hello I'm from Jilin</description>
      </User>
    </Users>
   用我的上篇文章也能夠很容的實現,不過下面我要用Linq to xml的方式實現生成這個xml文件,請看下面代碼:
1 using System;
2  using System.Collections.Generic;
3  using System.Linq;
4  using System.Text;
5  using System.Xml.Linq;
6
7  namespace OperateXmlLinq
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 //xml文件存儲路徑
14   string myXmlPath = "E:\\MyUsers.xml";
15 //創建xml文件
16   GenerateXmlFile(myXmlPath);
17 }
18
19 private static void GenerateXmlFile(string xmlPath)
20 {
21 try
22 {
23 //定義一個XDocument結構
24   XDocument myXDoc = new XDocument(
25 new XElement("Users",
26 new XElement("User", new XAttribute("ID", "111111"),
27 new XElement("name", "EricSun"),
28 new XElement("password", "123456"),
29 new XElement("description", "Hello I'm from Dalian")
30 ),
31 new XElement("User", new XAttribute("ID", "222222"),
32 new XElement("name", "Ray"),
33 new XElement("password", "654321"),
34 new XElement("description", "Hello I'm from Jilin")
35 )
36 )
37 );
38 //保存此結構(即:我們預期的xml文件)
39   myXDoc.Save(xmlPath);
40 }
41 catch (Exception ex)
42 {
43 Console.WriteLine(ex.ToString());
44 }
45 }
46 }
【注:由於使用了Linq to xml的方式,所以要引入命名空間System.Xml.Linq】,通過運行上面這段代碼,就可以創建我們預想的xml文件結構,並且可以看出用Linq這種方式,在代碼中就可以很清楚明瞭知道我們創建xml文件的結構(如:構造函數的參數所示)

  ②:【遍歷xml文件的節點信息】創造出了xml文件之後,我們就要知道如何獲得xml文件的各個節點的信息,請看如下代碼:

1 private static void GetXmlNodeInforOld(string xmlPath)
2 {
3 try
4 {
5 XDocument myXDoc = XDocument.Load(xmlPath);
6 XElement rootNode = myXDoc.Element("Users");
7 foreach (XElement node in rootNode.Elements("User"))
8 {
9 Console.WriteLine("User ID = {0}", node.Attribute("ID").Value);
10
11 string name = node.Element("name").Value;
12 string password = node.Element("password").Value;
13 string description = node.Element("description").Value;
14 Console.WriteLine("name = {0} \npassword = {1} \ndescription = {2}", name, password, description);
15 }
16 }
17 catch (Exception ex)
18 {
19 Console.WriteLine(ex.ToString());
20 }
21 }
22
23 private static void GetXmlNodeInformation(string xmlPath)
24 {
25 try
26 {
27 //定義並從xml文件中加載節點(根節點)
28   XElement rootNode = XElement.Load(xmlPath);
29 //查詢語句: 獲得根節點下name子節點(此時的子節點可以跨層次:孫節點、重孫節點......)
30 IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("name")
31 select target;
32 foreach (XElement node in targetNodes)
33 {
34 Console.WriteLine("name = {0}", node.Value);
35 }
36
37 //查詢語句: 獲取ID屬性值等於"111111"並且函數子節點的所有User節點(並列條件用"&&"符號連接)
38 IEnumerable<XElement> myTargetNodes = from myTarget in rootNode.Descendants("User")
39 where myTarget.Attribute("ID").Value.Equals("111111")
&&
myTarget.HasElements
40 select myTarget;
41 foreach (XElement node in myTargetNodes)
42 {
43 Console.WriteLine("name = {0}", node.Element("name").Value);
44 Console.WriteLine("password = {0}", node.Element("password").Value);
45 Console.WriteLine("description = {0}", node.Element("description").Value);
46 }
47 }
48 catch (Exception ex)
49 {
50 Console.WriteLine(ex.ToString());
51 }
52 }

  上面用了兩種方法去實現對xml文件節點信息的讀取,第一種方法是那種比較老的模式:通過父節點獲得它的子節點(一層一層的獲得),然後獲取目標節點的信息;第二中方法用到的是Linq to xml的查詢模式,根據我們的需求獲得符合條件的所有節點,然後對這些節點的信息進行讀取。

  接下來我們要簡單的講述一下Linq to xml的查詢模式(語法一看便懂,這裏就不過多闡述了),LINQ to XML 的一個最重要的性能優勢(與 XmlDocument 相比)爲:LINQ to XML 中的查詢是靜態編譯的,而 XPath 查詢則必須在運行時進行解釋,此功能是 LINQ to XML 的內置功能。

  在調試程序的時候我們發現,第二種方法的IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("name") select target;的這句話執行完畢後,得到的targetNodes依然是null,直到遍歷的時候才獲得相應的對象信息,這種方式就做延遲執行,【延遲執行】:意味着表達式的計算延遲,直到真正需要它的實現值爲止。 當必須操作大型數據集合,特別是在包含一系列鏈接的查詢或操作的程序中操作時,延遲執行可以大大改善性能。 在最佳情況下,延遲執行只允許對源集合的單個循環訪問。

  【注:查詢條件寫在where語句中,並列條件用"&&"符號連接,或條件用"||"符號連接】

  ③:【修改xml文件的節點信息】知道了如何查詢xml文件的節點信息之後,對相應節點信息做相應的修改,就顯得很容易了。請看如下代碼:

1 private static void ModifyXmlNodeInforOld(string xmlPath)
2 {
3 try
4 {
5 XDocument myXDoc = XDocument.Load(xmlPath);
6 myXDoc.Element("Users").Element("User").Attribute("ID").Value = "777777";
7 foreach (XElement node in myXDoc.Element("Users").Elements("User").Elements("description"))
8 {
9 node.SetValue("Hello, I'm from China.");
10 }
11 myXDoc.Save(xmlPath);
12 }
13 catch (Exception ex)
14 {
15 Console.WriteLine(ex.ToString());
16 }
17 }
18
19 private static void ModifyXmlNodeInformation(string xmlPath)
20 {
21 try
22 {
23 //定義並從xml文件中加載節點(根節點)
24 XElement rootNode = XElement.Load(xmlPath);
25 //查詢語句: 獲取ID屬性值等於"222222"或者等於"777777"的所有User節點(或條件用"||"符號連接)
26 IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("User")
27 where target.Attribute("ID").Value == "222222"
||
target.Attribute("ID").Value.Equals("777777")
28 select target;
29 //遍歷所獲得的目標節點(集合)
30 foreach (XElement node in targetNodes)
31 {
32 //將description節點的InnerText設置爲"Hello, I'm from USA."
33 node.Element("description").SetValue("Hello, I'm from USA.");
34 }
35 //保存對xml的更改操作
36 rootNode.Save(xmlPath);
37 }
38 catch (Exception ex)
39 {
40 Console.WriteLine(ex.ToString());
41 }
42 }

  這裏也用了兩種方法去獲取相應節點信息的,具體過程請看代碼就可以啦。

  ④:【向xml文件添加節點信息】下面的代碼是向原有xml文件中添加一個節點

1 private static void AddXmlNodeInformation(string xmlPath)
2 {
3 try
4 {
5 //定義並從xml文件中加載節點(根節點)
6 XElement rootNode = XElement.Load(xmlPath);
7 //定義一個新節點
8 XElement newNode = new XElement("User", new XAttribute("ID","999999"),
9 new XElement("name", "Rose"),
10 new XElement("password", "456123"),
11 new XElement("description", "Hello, I'm from UK."));
12 //將此新節點添加到根節點下
13 rootNode.Add(newNode);
14 //保存對xml的更改操作
15 rootNode.Save(xmlPath);
16 }
17 catch (Exception ex)
18 {
19 Console.WriteLine(ex.ToString());
20 }
21 }

  簡單做一個總結:下面的方法將子內容添加到 XElement 或 XDocument 中:

  方法                 說明

  Add                  在 XContainer 的子內容的末尾添加內容。

  AddFirst           在 XContainer 的子內容的開頭添加內容。

  下面的方法將內容添加爲 XNode 的同級節點。 向其中添加同級內容的最常見的節點是 XElement,不過你也可以將有效的同級內容添加到其他類型的節點,

  例如 XText 或 XComment。

  方法                         說明

  AddAfterSelf            在 XNode 後面添加內容。

  AddBeforeSelf          在 XNode 前面添加內容。

  ⑤:【刪除指定xml文件的節點信息】如何將剛剛加入的那個節點刪除掉呢?請看如下代碼:

1 private static void DeleteXmlNodeInformation(string xmlPath)
2 {
3 try
4 {
5 //定義並從xml文件中加載節點(根節點)
6 XElement rootNode = XElement.Load(xmlPath);
7 //查詢語句: 獲取ID屬性值等於"999999"的所有User節點
8 IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("User")
9 where target.Attribute("ID").Value.Equals("999999")
10 select target;
11
12 //將獲得的節點集合中的每一個節點依次從它相應的父節點中刪除
13 targetNodes.Remove();
14 //保存對xml的更改操作
15 rootNode.Save(xmlPath);
16 }
17 catch (Exception ex)
18 {
19 Console.WriteLine(ex.ToString());
20 }
21 }
至此,我們就完成對xml文件的基本操作:創建、讀取、修改、添加、刪除。由於剛剛學習Linq,理解的很淺顯,如有不合適的地方,歡迎大家指出~~

 

參考:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/01/27/1946239.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章