西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)其它知識(shí) → Linq To XML高級(jí)編程體驗(yàn)篇

Linq To XML高級(jí)編程體驗(yàn)篇

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/12/31 16:10:32字體大。A-A+

作者:佚名點(diǎn)擊:201次評(píng)論:1次標(biāo)簽: Linq XML

  • 類(lèi)型:數(shù)據(jù)庫(kù)類(lèi)大。1.7M語(yǔ)言:英文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

首先,我們?cè)贚inq初級(jí)班 Linq To XML體驗(yàn)(基礎(chǔ))和Linq初級(jí)班 Linq To XML體驗(yàn)(編程篇)了解了一些XML的基本知識(shí)以及如何用LINQ to XML對(duì)XML文檔進(jìn)行簡(jiǎn)單的操作,本文將繼續(xù)深入LINQ to XML,做一些高級(jí)編程的演示.我也是LINQ的初學(xué)者,文章中不免會(huì)有一些不對(duì)的地方,希望高手們多多指點(diǎn),為我們LINQ初學(xué)者們多提寶貴的意見(jiàn),我也會(huì)繼續(xù)努力的,本文章目錄如下所示:
目錄
1.Linq to XML函數(shù)構(gòu)造
2.Linq to XML批注
3.Linq to XML軸
4.Linq to XML事件

1.Linq to XML函數(shù)構(gòu)造
函數(shù)構(gòu)造是指通過(guò)單個(gè)語(yǔ)句構(gòu)建XML樹(shù)的能力.在Linq初級(jí)班 Linq To XML體驗(yàn)(編程篇)中我們已經(jīng)體驗(yàn)了如何使用XElement和XAttribute類(lèi)手工創(chuàng)建XML樹(shù),也可以通過(guò)其他XElement和XAttribute對(duì)象傳遞給XElement類(lèi)的構(gòu)造函數(shù)來(lái)創(chuàng)建子元素和屬性,也就是說(shuō),LINQ查詢(xún)的結(jié)果可以用來(lái)創(chuàng)建XML樹(shù),下面就來(lái)看看一個(gè)演示:
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------
using System;using System.Xml.Linq;using System.Linq;namespace ConsoleApplication1
{
class Program { static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", new XElement("Name", "Huang Cong"), new XElement("Sex", "男"), new XElement("Age", 22)), new XElement("Person", new XElement("Name", "Li Si"), new XElement("Sex", "女"), new XElement("Age", 12)) )); //通過(guò)LINQ查詢(xún)將xel的元素添加至新的XElement中 XElement newXel = new XElement(new XElement("NewRoot", new XElement("Persons", xel.Elements().Where(u => u.Name == "Person").Select(u => u) )));
Console.WriteLine(newXel);
} }}
運(yùn)行結(jié)果:



2.Linq to XML批注
LINQ to XML批注是指將一個(gè)對(duì)象添加或關(guān)聯(lián)到一個(gè)XML節(jié)點(diǎn)或者屬性,批注可以是任何類(lèi)型的任何對(duì)象,可以通過(guò)XElement或XAttribute類(lèi)的AddAnnotation方法來(lái)添加批注,需要注意的是:當(dāng)調(diào)用AddAnnotation方法時(shí),是將一個(gè)新的對(duì)象添加至相應(yīng)的元素或?qū)傩陨?原先綁定的批注并不會(huì)被刪除掉,如果想刪除批注,可以調(diào)用RemoveAnnotations方法:
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------
using System;using System.Xml.Linq;using System.Linq;namespace ConsoleApplication1
{
class Program { public class Test { public int Id { get; set; } public string Info { get; set; } } static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", "Huang Cong"))); //為元素添加2個(gè)批注 xel.Element("Person").AddAnnotation(new Test() { Id = 1, Info = "測(cè)試1" }); xel.Element("Person").AddAnnotation(new Test() { Id = 2, Info = "測(cè)試2" }); Console.WriteLine("為元素添加2個(gè)批注:"); var query = xel.Element("Person").Annotations<Test>().Select(u => u); foreach (var q in query)
{
Console.WriteLine(q.Info); } Console.WriteLine("-------------------------------------"); //刪除所有批注 xel.Element("Person").RemoveAnnotations<Test>();
Console.WriteLine("刪除所有批注:"); query = xel.Element("Person").Annotations<Test>().Select(u => u); foreach (var q in query)
{
Console.WriteLine(q.Info); } Console.WriteLine("-------------------------------------"); } }}
運(yùn)行結(jié)果:




3.Linq to XML軸
LINQ to XML提供了對(duì)XML的查詢(xún)功能,以查找特定的元素或者屬性并返回它們的值,LINQ to XML的軸方法讓你可以輕松實(shí)現(xiàn)以上的功能,LINQ to XML還提供了返回個(gè)別節(jié)點(diǎn)的方法,這可以讓開(kāi)發(fā)人員處理更細(xì)粒度的細(xì)節(jié).下面是幾個(gè)主要的軸方法:
1. Descendants和DescendantsAndSelf
2. Ancestors和AncestorsAndSelf
3. ElementsAfterSelf和ElementBeforeSelf
下面分別給各個(gè)方法做示例講解:


3.1 Descendants和DescendantsAndSelf
Descendants方法返回指定元素的后繼元素的集合,不包括元素本身,而DescendantsAndSelf則包括元素本身.
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------using System;using System.Xml.Linq;using System.Linq;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", new XElement("Name", "Huang Cong"), new XElement("Age", 22)), new XElement("Person", new XElement("Name", "Li Si"), new XElement("Age", 12)) )); Console.WriteLine("遍歷所有元素:"); var des = xel.Descendants(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); Console.WriteLine("遍歷所有名稱(chēng)為Person的元素,不包括本身:"); des = xel.Descendants("Person").Descendants(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); Console.WriteLine("遍歷所有名稱(chēng)為Person的元素,包括本身:"); des = xel.Descendants("Person").DescendantsAndSelf(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); } }}
運(yùn)行結(jié)果:




3.2 Ancestors和AncestorsAndSelf
Ancestors方法返回指定節(jié)點(diǎn)的上級(jí)元素,不包括元素本身,而AncestorsAndSelf則包括元素本身.
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------using System;using System.Xml.Linq;using System.Linq;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", new XElement("Name", "Huang Cong")) )); Console.WriteLine("遍歷所有元素:"); var des = xel.Descendants(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); Console.WriteLine("遍歷所有名稱(chēng)為Name的元素的上級(jí)元素集合,不包括本身:"); des = xel.Element("Person").Element("Name").Ancestors(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); Console.WriteLine("遍歷所有名稱(chēng)為Name的元素的上級(jí)元素集合,包括本身:"); des = xel.Element("Person").Element("Name").AncestorsAndSelf(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); } }}
運(yùn)行結(jié)果:




3.3 ElementsAfterSelf和ElementBeforeSelf
ElementsAfterSelf方法和ElementBeforeSelf方法分別返回指定元素之后的元素和值指定元素之前的元素,也可以指定條件返回指定的元素集合.
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------
using System;
using System.Xml.Linq;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{ static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", new XElement("Name", "Huang Cong"), new XElement("Sex","男"), new XElement("Age",12))) );
Console.WriteLine("獲取Name元素之后的元素集合:");
var des = xel.Element("Person").Element("Name").ElementsAfterSelf(); foreach (var d in des)
{
Console.WriteLine(d); } Console.WriteLine("----------------------------------");
Console.WriteLine("獲取Name元素之后的名為Sex的元素集合:");
des = xel.Element("Person").Element("Name").ElementsAfterSelf("Sex");
foreach (var d in des)
{
Console.WriteLine(d); } Console.WriteLine("----------------------------------");
Console.WriteLine("獲取Age元素之前的元素集合:"); des = xel.Element("Person").Element("Age").ElementsBeforeSelf(); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); Console.WriteLine("獲取Age元素之前的名為Sex的元素集合:"); des = xel.Element("Person").Element("Age").ElementsBeforeSelf("Sex"); foreach (var d in des) { Console.WriteLine(d); } Console.WriteLine("----------------------------------"); } }}
運(yùn)行結(jié)果:


4.Linq to XML事件
在對(duì)XML樹(shù)進(jìn)行修改的時(shí)候,LINQ to XML事件會(huì)提供通知,LINQ to XML提供了2個(gè)事件來(lái)響應(yīng)XML樹(shù)的修改:Changing和Changed.當(dāng)修改XML樹(shù)時(shí)這2個(gè)時(shí)間會(huì)相繼被觸發(fā).從運(yùn)行結(jié)果我們可以看出,更新動(dòng)作實(shí)際上是一個(gè)刪除操作加上一個(gè)添加完成的:
代碼
//-----------------------------------------------------------// All Rights Reserved , Copyright (C) 2010 ,黃聰 , Ltd .//-----------------------------------------------------------using System;using System.Xml.Linq;using System.Linq;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { XElement xel = new XElement(new XElement("Root", new XElement("Person", new XElement("Name", "Huang Cong"), new XElement("Sex","男"), new XElement("Age",12))) ); xel.Changing += new EventHandler<XObjectChangeEventArgs>(xel_Changing); xel.Changed += new EventHandler<XObjectChangeEventArgs>(xel_Changed); //修改Person元素的Age元素值 xel.Element("Person").SetElementValue("Age", 22); } static void xel_Changed(object sender, XObjectChangeEventArgs e) { Console.WriteLine("觸發(fā)Changed事件:"); Console.WriteLine("ChangedValue:{0} \tObjectChange:{1}", ((XNode)sender).ToString(), e.ObjectChange); Console.WriteLine("------------------------------------"); } static void xel_Changing(object sender, XObjectChangeEventArgs e) { Console.WriteLine("觸發(fā)Changing事件:"); Console.WriteLine("ChangingValue:{0} \tObjectChange:{1}", ((XNode)sender).ToString(), e.ObjectChange); Console.WriteLine("------------------------------------"); } }}
運(yùn)行結(jié)果:


警告:不允許在被觸發(fā)事件的執(zhí)行過(guò)程中修改XML樹(shù),特別不要在事件中修改觸發(fā)事件發(fā)生的節(jié)點(diǎn),因?yàn)檫@會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果.不過(guò)可以在事件中修改另外一個(gè)XML樹(shù).


小結(jié):
LINQ to XML提供了大量方便的方法和接口給開(kāi)發(fā)人員操作XML文檔,這大大的提高了開(kāi)發(fā)效率,希望本章的內(nèi)容對(duì)你有所幫助哈,我也是LINQ的初學(xué)者,文章中不免會(huì)有一些不對(duì)的地方,希望高手們多多指點(diǎn),為我們LINQ初學(xué)者們多提寶貴的意見(jiàn),我也會(huì)繼續(xù)努力的~~

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀(guān)圍觀(guān)
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(1)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)