如果僅僅會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樹組件的類組成,如圖所示
其中最重要的三個類為:XDocument、XElement和XAttribute,可以通過它們快速創建一棵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
你若堅持,定會發光,時間是所向披靡的武器,它能集腋成裘,也能聚沙成塔,將人生的不可能都變成可能。
如果覺得文章不錯,請點個贊吧!