偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

LINQ to XML深入剖析

開(kāi)發(fā) 后端
這里介紹LINQ to XML解決了DOM模型中的幾個(gè)比較不方便的問(wèn)題,如修改節(jié)點(diǎn)名字的問(wèn)題;同時(shí)也拋棄了一些看起來(lái)很強(qiáng)大但是很不常用的東西,如實(shí)體和實(shí)體引用。

LINQ to XML提供了為豐富并且簡(jiǎn)潔的類(lèi)來(lái)實(shí)現(xiàn)對(duì)XML的操作。相對(duì)于種類(lèi)繁多的DOM模型的XML類(lèi)庫(kù)而言,LINQ的類(lèi)使我們的學(xué)習(xí)曲線變得平滑并且還能達(dá)到相同的效果。LINQ to XML解決了DOM模型中的幾個(gè)比較不方便的問(wèn)題,如修改節(jié)點(diǎn)名字的問(wèn)題;同時(shí)也拋棄了一些看起來(lái)很強(qiáng)大但是很不常用的東西,如實(shí)體和實(shí)體引用。這樣使得LINQ to XML的操作速度更快并且更方便。以下的幾個(gè)例子將展示給大家LINQ to XML如何完成節(jié)點(diǎn)名稱(chēng)修改,增加和刪除的效果。

首先,我們看一下添加一個(gè)節(jié)點(diǎn)到XML中是這么樣實(shí)現(xiàn)的:

  1. XElement xelem = XElement.Load(@"example.xml");   
  2. XElement newnewXelem = new XElement("NewNode", "This is new node");   
  3. xelem.Add(newXelem);  

相當(dāng)?shù)暮?jiǎn)單,只要先生成一個(gè)XElement對(duì)象然后把它Add到當(dāng)前節(jié)點(diǎn)對(duì)象就可以了。進(jìn)一步我們仔細(xì)查看一下XElement可以添加節(jié)點(diǎn)的方法??梢钥吹揭还灿蠥dd, AddAfterSelf, AddAnnotation, AddBeforeSelf, AddFirst這五個(gè)方法。在默認(rèn)情況下,Add的操作是將新節(jié)點(diǎn)作為被插入節(jié)點(diǎn)的最后一個(gè)孩子節(jié)點(diǎn)插入的,而AddFirst正好相反。AddAfterSelf和AddBeforeSelf則是將節(jié)點(diǎn)作為兄弟節(jié)點(diǎn)插入的,這里要注意的是調(diào)用這兩個(gè)方法的時(shí)候不能以根節(jié)點(diǎn)作為被插入節(jié)點(diǎn),因?yàn)閄ML文檔規(guī)定只能有一個(gè)根節(jié)點(diǎn)。最后,我們來(lái)看一下AddAnnotation這個(gè)方法。
AddAnnotation是為一個(gè)節(jié)點(diǎn)添加一個(gè)相關(guān)的評(píng)注的類(lèi)對(duì)象。這個(gè)類(lèi)對(duì)象可以用戶(hù)自己定義,所以通過(guò)這個(gè)方法我們可以擴(kuò)展XML文檔對(duì)象的功能,例如根據(jù)節(jié)點(diǎn)來(lái)獲取類(lèi)對(duì)象的功能。下面是一段引用自msdn的代碼:

  1. public class MyAnnotation   
  2. {   
  3. private string tag;   
  4. public string Tag { get { return tag; } set { tag = value; } }   
  5. public MyAnnotation(string tag)   
  6. {   
  7. this.tag = tag;   
  8. }   
  9. }   
  10. … …   
  11. MyAnnotation ma = new MyAnnotation("T1");   
  12. XElement root = new XElement("Root", "content");   
  13. root.AddAnnotation(ma);   
  14. MyAnnotation ma2 = (MyAnnotation)root.Annotation<MyAnnotation>();  

接下來(lái)我們?cè)倏匆幌氯绾卫肔INQ to XML來(lái)更新XML的信息。對(duì)XML文檔進(jìn)行更新主要包括兩個(gè)方面,一個(gè)方面是對(duì)元素屬性和值得更新;另一方面是對(duì)元素名稱(chēng)的更新。在一般情況下,我們通常只對(duì)元素的屬性和值進(jìn)行更新,代碼如下:

  1. XElement xelem = XElement.Load(@"example.xml");   
  2. var partNos = from item in xelem.Descendants("Item")   
  3. where item.Attribute("PartNumber").Value == "872-AA"   
  4. select item;   
  5.  
  6. foreach (XElement node in partNos)   
  7. {   
  8. node.Value = "Hello";   
  9. Console.WriteLine(node.Value);   
  10. }  

對(duì)于XML元素的更新操作,關(guān)鍵就是在于查詢(xún)上面,如何有效并準(zhǔn)確的查詢(xún)到目標(biāo)元素是一個(gè)比較有挑戰(zhàn)性的問(wèn)題,這就像SQL語(yǔ)句一樣對(duì)于同一個(gè)查詢(xún)不同的寫(xiě)法和關(guān)系連接效率就不一樣,這個(gè)讀者需要自己多加練習(xí)。在上面的代碼段中,我們?nèi)ゲ檎宜袑傩詾镻artNumber=872-AA的元素并將其更新為Hello。那么如果想操作元素值,只需將修改查詢(xún)條件為:

  1. var partNos = from item in xelem.Descendants("ProductName")   
  2. where item.Value == "Lawnmower"  

XML文檔的元素名稱(chēng)更新相比較于值更新要麻煩許多。由于XML文檔結(jié)構(gòu)是一個(gè)類(lèi)樹(shù)形結(jié)構(gòu),學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)的讀者知道要更新一個(gè)樹(shù)節(jié)點(diǎn)的指針,最少需要三個(gè)步驟 :
A. 查找目標(biāo)樹(shù)節(jié)點(diǎn)的父節(jié)點(diǎn)
B. 將先前的節(jié)點(diǎn)的孩子轉(zhuǎn)移到新節(jié)點(diǎn)
C. 將父節(jié)點(diǎn)的子節(jié)點(diǎn)替換(如果需要還要用算法重新排序樹(shù))。

所以我們也需要用同樣的邏輯來(lái)處理XML節(jié)點(diǎn)的更新。那么相比較DOM文檔對(duì)象和LINQ to XML對(duì)元素名稱(chēng)更新操作,LINQ to XML的步驟要簡(jiǎn)單許多。

  1. XElement xel = XElement.Load(@"example.xml");   
  2. var itemNos = from item in xel.Descendants("Item")   
  3. select item;   
  4. int n = itemNos.Count();   
  5. for (int i=0; i<n; i++)   
  6. {   
  7. // 新創(chuàng)建節(jié)點(diǎn)   
  8. XElement nEl = new XElement("Element");   
  9. // 轉(zhuǎn)移孩子節(jié)點(diǎn)   
  10. nEl.Add(itemNos.ElementAt(0).Elements());   
  11. // 替換   
  12. itemNos.ElementAt(0).ReplaceWith(nEl);   
  13. }   
  14. Console.Write(xel);  

上面的代碼是將所有名稱(chēng)為Item的元素替換成名稱(chēng)為Element。細(xì)心的讀者可以看到我在for循環(huán)中獲取itemNos的孩子都使用0這個(gè)索引值,為什么呢?這是因?yàn)樵诿杜e器中如果前面的對(duì)象消失那么索引位置就會(huì)下移,那么當(dāng)我們替換一個(gè)元素后,下一個(gè)元素的索引自動(dòng)變?yōu)?,所以我們只要循環(huán)指定次數(shù)就可以遍歷所有元素來(lái)。這也是為什么不用foreach的原因。那么我們進(jìn)一步的出思考XML名稱(chēng)替換這個(gè)問(wèn)題。我們會(huì)發(fā)現(xiàn)LINQ to XML的 XElement類(lèi)提供了4個(gè)方法用來(lái)支持該功能:ReplaceAll, ReplaceAttributes, ReplaceNodes和ReplaceWith。這四個(gè)方法除了ReplaceWith是操作本元素以為,其他的都是操作元素的孩子或是屬性?xún)?nèi)容。這里提供的好處是如果我們想遍歷替換操作,就不必去重復(fù)的查詢(xún)目標(biāo)元素。

最后,我們討論一下如何利用LINQ to XML來(lái)刪除一個(gè)元素。對(duì)于類(lèi)樹(shù)形結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō),刪除一個(gè)元素意味著兩種情況:一、刪除本節(jié)點(diǎn)和其所有子節(jié)點(diǎn);二、只刪除本節(jié)點(diǎn)。而在刪除節(jié)點(diǎn)之前,我們需要先定位到目標(biāo)節(jié)點(diǎn),所以要先進(jìn)行查詢(xún)操作:

  1. XElement xelem = XElement.Load(@"example.xml");   
  2. var partNos = from item in xelem.Descendants("Item")   
  3. where item.Attributes("PartNumber").Single().Value == "872-AA"   
  4. select item;   
  5. partNos.Remove();   
  6. Console.Write(xelem);  

【編輯推薦】

  1. LINQ查詢(xún)操作剖析
  2. LINQ生成字符串概述
  3. LINQ查詢(xún)語(yǔ)法簡(jiǎn)單描述
  4. LINQ解決方案簡(jiǎn)單概述
  5. LINQ查詢(xún)結(jié)果分析
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-09-16 16:59:05

LINQ to XML

2009-09-08 09:59:26

LINQ遍歷多個(gè)數(shù)組

2009-09-07 17:18:33

LINQ查詢(xún)表達(dá)式

2009-09-08 16:31:13

Linq開(kāi)放式并發(fā)

2011-07-22 08:43:08

XML

2009-09-10 14:37:57

LINQ匿名類(lèi)型

2009-09-17 13:15:20

LINQ查詢(xún)

2009-09-09 14:40:43

Linq to sql

2009-09-09 16:21:31

Linq使用sqlme

2009-09-14 10:13:02

LINQ查詢(xún)操作

2009-09-17 13:54:26

LINQ to XML

2009-01-04 16:58:48

LINQ to XMLLINQXML

2009-09-09 13:39:05

Linq用戶(hù)定義函數(shù)

2009-09-14 10:35:15

Linq內(nèi)部執(zhí)行原理

2009-09-16 15:33:22

LINQ to XML

2009-09-16 16:52:50

LINQ to XML

2011-07-26 13:58:17

LINQ

2009-09-08 16:20:12

LINQ to SQL

2009-09-15 14:52:15

linq級(jí)聯(lián)刪除

2009-09-16 09:56:42

LINQ to SQL
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)