C# LINQ to XML


  如果僅僅會LINQ基礎,那么或許不能體會到LINQ功能的強大,當你了解LINQ to XML后,就不一樣了......

 

一、LINQ to XML API

  可擴展標記語言(XML)是存儲和交換數據的重要方法,LINQ to XML可以以兩種方式和XML配合使用。第一種是作為簡化的XML操作API,第二種是使用LINQ查詢工具。

  從介紹LINQ to XML API開始

  LINQ to XML API由很多XML樹組件的類組成,如圖所示

          

其中最重要的三個類為:XDocumentXElementXAttribute,可以通過它們快速創建一棵XML樹

using System;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace 簡單XML使用
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xd = new XDocument(
                new XElement("MyXElement",
                new XElement("first",
                new XAttribute("color", "red"),
                new XAttribute("size", "small")),
                new XElement("second",
                new XAttribute("color", "green"),
                new XAttribute("size", "medium")),
                new XElement("third",
                new XAttribute("color", "blue"),
                new XAttribute("size", "large"))));
            Console.WriteLine(xd);
            Console.ReadKey();
        }
    }
}

對一些重要的類進行詳細講解(由於上面的例子中已經使用了下面的一些類,所以講一些類的時候沒有再繼續舉例子)

  1.1  XDocument類

    XDocument類提供了處理XML文檔的方法,包括聲明、注釋和處理指令。

    XDocument類可以包含0個或一個 XDeclaration節點、XDocumentType節點和XElement節點,還可以包含任意數量的XProcessingInstruction節點

    如果XDocument中有最高級別的XElement節點,那么它就是XML樹中其他元素的根,根元素可以包含任意數量的嵌套XElement、XComment或XProcessingInstruction節點

 上圖演示了用於構造XML樹的類以及它們如何被嵌套 (嘻嘻,圖有點丑,別見怪),需要注明的是圖中“1”代表可以嵌套0個或一個,“n”表示任意個

 

  1.2  XElement類

     它表示一個 XML 元素。 可以使用該類創建元素、更改元素內容;添加、更改或刪除子元素;向元素中添加屬性;或以文本格式序列化元素內容。

 

  1.3   XAttribute類

    XAttribute類用來處理元素的特性,特性可以是與元素相關聯的“名稱-值”對,也可以接受現有的XAttribute的引用。每個元素中不能有名稱重復的特性。

    舉個栗子。

using System;using System.Xml.Linq;

namespace 簡單XML使用
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xd = new XDocument(   //創建XML樹
                new XElement("root",
                new XAttribute("color", "red"),     //添加XAttribute屬性
                new XAttribute("size", "large"),
                new XElement("first")
                )
            );
            Console.WriteLine(xd);
            XElement rt = xd.Element("root");//獲取元素
            XAttribute color = rt.Attribute("color");//獲取特性
            XAttribute size = rt.Attribute("size");

            Console.WriteLine("color: {0}", color);//顯式特性
            Console.WriteLine("size: {0}", size.value);
            Console.ReadKey();
        }
    }
}

                        注意一個是直接輸出color,另一個是size.value

 

  1.4  XDeclaration類

    XML聲明,可以聲明包含XML使用的版本號、字符編碼類型以及文檔是否依賴於外部引用。

new XDeclaration("2.0", "utf-8", "yes")

  這段代碼產生的XML文檔為:<?xml version="2.0" encoding="utf-8" standalone="yes"  ?>

 

  1.5 XProcessingInstruction類

    XML處理指令用於提供XML文檔如何被使用和翻譯的額外數據,最常見的就是把處理指令用於關聯XML文檔和一個樣式表。

    我們可以使用XProcessingInstruction構造函數來包含處理指令。它接受兩個字符串參數:目標和數據串。如果處理指令接受多個數據參數,這些參數必須包含在XProcessingInstruction構造函數的第二個字符串中,如下面的代碼所示。

new XProcessingInstruction("xml-stylesheet",@"href=""stories"", type=""text/css""")

產生的XML文檔為: <?xml-stylesheet href="stories", type="text/css"?>

注意示例中第二個參數是一個字符串,在字符串中的雙引號文本使用兩個連續的雙引號來表現

 

二、使用XML樹的值

  當我們遍歷XML樹來獲取或修改值時才體現出XML的強大。下表給出了用於獲取數據的主要方法

方法名稱 返回類型 描述
Nodes XDocument、XElement IEnumerable<object> 返回當前節點的所有子節點(不管是什么類型)
Elements XDocument、XElement IEnumerable<XElement> 返回當前節點的XElement子節點,或所有具有某個名字的子節點
Element XDocument、XElement XElement 返回當前節點的第一個XElement子節點,或具有某個名字的子節點
Descendants XElement IEnumerable<XElement> 返回所有的XElement子代節點,或所有具有某個名字的XElement子代節點,不管它們處於當前節點下嵌套的什么層次
DescendantsAndSelf XElement IEnumerable<XElement> 和Descendants一樣,不過包含當前節點
Ancestors XElement IEnumerable<XElement> 返回所有上一級XElement節點,或者所有具有某個名字的上級XElement節點
AncestorsAndSelf XElement IEnumerable<XElement> 和Ancestors一樣,但包含當前節點
Parent XElement XElement 返回當前節點的父節點

  關於表中的方法,需要了解的一些重要事項如下:

  a:  Nodes  Nodes方法返回IEnumerable<object>類型的對象,因為返回的節點可能是不同類型,比如XElement、XComment等。我們可以使用以類型作為參數的方法OfType(type)來指定返回某個類型的節點,下面代碼只獲取XComment節點

IEnumerable<XComment> comments = xd.Nodes().OfType<XComment>();

  b:  Elements  由於獲取XElement是一個非常普遍的需求,就出現了Nodes.OfType<XElement>()表達式的簡短形式-------Elements方法

           使用無參數的Elements方法返回所有的子Elements。

           使用單個name參數的Elements方法只返回具有這個名字的子XElements

IEnumerable<XElement> empPhone = emp.Elements("PhoneNumber");

    Element用法與其類似

  c:  Descendants和Ancestors用法與Elements差不多,只不過它們不返回直接的子元素,而是忽略嵌套級別,包含所有之下或者之上的節點

 

三、操縱XML

  LINQ to XML一個重要的特性是能夠方便地修改xml樹,下表列出了最重要的一些操縱XML的方法

方法名稱 從哪里調用         描述
Add 父節點 在當前節點的既有子節點后增加新的子節點
AddFirst 父節點 在當前節點的既有子節點前增加新的子節點
AddBeforeSelf 節點 在同級別的當前節點之前增加新節點
AddAfterSelf 節點 在同級別的當前節點之后增加新節點
Remove 節點 刪除當前所選的節點及其內容
RemoveNodes 節點 刪除當前所選的XElement及其內容
SetElement 父節點 設置節點內容
ReplaceContent 節點 替換節點內容

  讓我們來看看這些方法怎么使用(注:下面的代碼建立在前面的基礎上)

 

  3.1  添加

 XElement rt = xd.Element("root");
 rt.Add(new XElement("second", "2"));

  執行后將在first節點后增加一個新節點

  AddFirst等方法你們可以自己試試,這樣更能加深印象,用法也差不多(不會告訴你是因為我太懶了不願寫的)

 

  3.2  刪除

XElement rt1 = rt.Element("second");
rt1.Remove();

  上面代碼將例2.1創建的節點刪除。

  也可以使用RemoveAll()方法

 

  3.3  更新

  在LINQ to XML中更新xml內容可以使用以下幾種方法:

rt.Element("first").ReplaceWith(new XElement("NewFirst"));
rt.SetElementValue("second", "two");

上述代碼將名為first節點的名字改變為NewFirst,名為second節點的值設置為two

 

   你若堅持,定會發光,時間是所向披靡的武器,它能集腋成裘,也能聚沙成塔,將人生的不可能都變成可能。

   如果覺得文章不錯,請點個贊吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM