成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ to XML深入剖析

開發 后端
這里介紹LINQ to XML解決了DOM模型中的幾個比較不方便的問題,如修改節點名字的問題;同時也拋棄了一些看起來很強大但是很不常用的東西,如實體和實體引用。

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

首先,我們看一下添加一個節點到XML中是這么樣實現的:

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

相當的簡單,只要先生成一個XElement對象然后把它Add到當前節點對象就可以了。進一步我們仔細查看一下XElement可以添加節點的方法。可以看到一共有Add, AddAfterSelf, AddAnnotation, AddBeforeSelf, AddFirst這五個方法。在默認情況下,Add的操作是將新節點作為被插入節點的最后一個孩子節點插入的,而AddFirst正好相反。AddAfterSelf和AddBeforeSelf則是將節點作為兄弟節點插入的,這里要注意的是調用這兩個方法的時候不能以根節點作為被插入節點,因為XML文檔規定只能有一個根節點。最后,我們來看一下AddAnnotation這個方法。
AddAnnotation是為一個節點添加一個相關的評注的類對象。這個類對象可以用戶自己定義,所以通過這個方法我們可以擴展XML文檔對象的功能,例如根據節點來獲取類對象的功能。下面是一段引用自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>();  

接下來我們再看一下如何利用LINQ to XML來更新XML的信息。對XML文檔進行更新主要包括兩個方面,一個方面是對元素屬性和值得更新;另一方面是對元素名稱的更新。在一般情況下,我們通常只對元素的屬性和值進行更新,代碼如下:

  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. }  

對于XML元素的更新操作,關鍵就是在于查詢上面,如何有效并準確的查詢到目標元素是一個比較有挑戰性的問題,這就像SQL語句一樣對于同一個查詢不同的寫法和關系連接效率就不一樣,這個讀者需要自己多加練習。在上面的代碼段中,我們去查找所有屬性為PartNumber=872-AA的元素并將其更新為Hello。那么如果想操作元素值,只需將修改查詢條件為:

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

XML文檔的元素名稱更新相比較于值更新要麻煩許多。由于XML文檔結構是一個類樹形結構,學過數據結構的讀者知道要更新一個樹節點的指針,最少需要三個步驟 :
A. 查找目標樹節點的父節點
B. 將先前的節點的孩子轉移到新節點
C. 將父節點的子節點替換(如果需要還要用算法重新排序樹)。

所以我們也需要用同樣的邏輯來處理XML節點的更新。那么相比較DOM文檔對象和LINQ to XML對元素名稱更新操作,LINQ to XML的步驟要簡單許多。

  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. // 新創建節點   
  8. XElement nEl = new XElement("Element");   
  9. // 轉移孩子節點   
  10. nEl.Add(itemNos.ElementAt(0).Elements());   
  11. // 替換   
  12. itemNos.ElementAt(0).ReplaceWith(nEl);   
  13. }   
  14. Console.Write(xel);  

上面的代碼是將所有名稱為Item的元素替換成名稱為Element。細心的讀者可以看到我在for循環中獲取itemNos的孩子都使用0這個索引值,為什么呢?這是因為在枚舉器中如果前面的對象消失那么索引位置就會下移,那么當我們替換一個元素后,下一個元素的索引自動變為0,所以我們只要循環指定次數就可以遍歷所有元素來。這也是為什么不用foreach的原因。那么我們進一步的出思考XML名稱替換這個問題。我們會發現LINQ to XML的 XElement類提供了4個方法用來支持該功能:ReplaceAll, ReplaceAttributes, ReplaceNodes和ReplaceWith。這四個方法除了ReplaceWith是操作本元素以為,其他的都是操作元素的孩子或是屬性內容。這里提供的好處是如果我們想遍歷替換操作,就不必去重復的查詢目標元素。

最后,我們討論一下如何利用LINQ to XML來刪除一個元素。對于類樹形結構的數據來說,刪除一個元素意味著兩種情況:一、刪除本節點和其所有子節點;二、只刪除本節點。而在刪除節點之前,我們需要先定位到目標節點,所以要先進行查詢操作:

  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查詢操作剖析
  2. LINQ生成字符串概述
  3. LINQ查詢語法簡單描述
  4. LINQ解決方案簡單概述
  5. LINQ查詢結果分析
責任編輯:佚名 來源: IT168
相關推薦

2009-09-16 16:59:05

LINQ to XML

2009-09-07 17:18:33

LINQ查詢表達式

2009-09-08 16:31:13

Linq開放式并發

2009-09-08 09:59:26

LINQ遍歷多個數組

2011-07-22 08:43:08

XML

2009-09-10 14:37:57

LINQ匿名類型

2009-09-17 13:15:20

LINQ查詢

2009-09-09 14:40:43

Linq to sql

2009-09-09 16:21:31

Linq使用sqlme

2009-09-14 10:13:02

LINQ查詢操作

2009-09-17 13:54:26

LINQ to XML

2009-09-14 10:35:15

Linq內部執行原理

2009-09-09 13:39:05

Linq用戶定義函數

2009-09-08 16:20:12

LINQ to SQL

2009-09-15 14:52:15

linq級聯刪除

2009-09-16 09:56:42

LINQ to SQL

2009-09-18 17:17:58

LINQ模型

2009-09-08 15:39:13

Linq使用Inser

2009-09-17 09:20:34

Linq和dLinq區

2009-09-17 13:30:32

LINQ to XML
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人高清视频 | 久久综合99 | 国产精品久久久久久久久久免费看 | 免费在线成人 | 久久99精品久久久 | 成人a视频 | 国产在线观看 | 欧美一区二区三区在线观看 | 国内成人免费视频 | 久久久久国产一级毛片 | 久久久久久网站 | 免费一二区 | 欧美伊人久久久久久久久影院 | 婷婷综合网 | 蜜桃视频在线观看免费视频网站www | 久久精品小视频 | 日韩www | 日韩第一区 | 天天夜天天操 | 免费看a | 亚洲午夜视频在线观看 | 一级黄色片美国 | 久久精品国产亚洲夜色av网站 | 国产精品成人一区二区 | 国产真实乱对白精彩久久小说 | 日韩欧美在线播放 | 亚洲欧美在线观看 | 欧美激情国产精品 | 狠狠操电影 | 午夜免费看视频 | 国产午夜精品一区二区三区嫩草 | 婷婷综合五月天 | 日韩一区二区三区在线观看 | 一区二区三区国产视频 | 黄色免费网站在线看 | 成人毛片视频免费 | 国产成人精品一区二区三区在线 | 成人精品视频在线 | 亚洲啊v| 欧美色综合 | 2022精品国偷自产免费观看 |