LINQ to XML詳細(xì)描述
在向大家詳細(xì)介紹LINQ to XML之前,首先讓大家了解下LINQ to Object,然后全面介紹LINQ to XML。
LINQ to Object
- MethodInfo[] methods = typeof(string).GetMethods();
 - var q = from t in methods
 - where (t.Name.Length > 15)
 - select t;
 
LINQ to Object主要是基于.NET框架里的Lambda表達(dá)式來實(shí)現(xiàn)的,因此上面的代碼運(yùn)行結(jié)果等同于下面的代碼:
- MethodInfo[] methods = typeof(string).GetMethods();
 - var q = methods
 - .Where((method) => method.Name.Length > 15)
 - .Select((name) => name.Name);
 
LINQ to XML
- XElement xelem = XElement.Load(@"example.xml");
 - // 查詢節(jié)點(diǎn)名為Item,并返回它們的PartNumber屬性值的集合
 - IEnumerable<string> partNos = from item in xelem.Descendants("Item")
 - Select (string)item.Attribute("PartNumber");
 - foreach (string str in partNos)
 - Console.WriteLine(str);
 
在.NET3.5中,框架對XML的操作進(jìn)行了擴(kuò)展,這個擴(kuò)展就是LINQ to XML。在名稱空間System.Xml.LINQ下。從以上的代碼我們可以看到增加了一個新的XElement對象。我們通過XElement.Load方法來裝載XML文檔,而不是傳統(tǒng)的DOM模式XmlDocument.Load。
相比較于W3C的DOM文檔結(jié)構(gòu)來說,LINQ to XML為我們提供了一種更方便的創(chuàng)建一個XML文檔的方式
- XElement contacts =
 - new XElement("Contacts",
 - new XElement("Name", "Ice Lee"),
 - new XElement("Phone", "010-876546",
 - new XAttribute("Type", "Home")),
 - new XElement("Phone", "425-23456",
 - new XAttribute("Type", "Work")),
 - new XElement("Address",
 - new XElement("Street", "ZhiXinCun"),
 - new XElement("City", "Beijin")
 - )
 - );
 - 輸出結(jié)果:
 - <? Xml version="1.0" encoding="utf-8"?>
 - <Contacts>
 - <Name>Ice Lee</Name>
 - <Phone Type="Home">010-876546</Phone>
 - <Phone Type="Work">425-23456</Phone>
 - <Address>
 - <Street>ZhiXinCun</Street>
 - <City>Beijing</City>
 - </Address>
 - </Contacts>
 
LINQ to XML提供了為豐富并且簡潔的類來實(shí)現(xiàn)對XML的操作。相對于種類繁多的DOM模型的XML類庫而言,LINQ的類使我們的學(xué)習(xí)曲線變得平滑并且還能達(dá)到相同的效果。LINQ to XML解決了DOM模型中的幾個比較不方便的問題,如修改節(jié)點(diǎn)名字的問題;同時也拋棄了一些看起來很強(qiáng)大但是很不常用的東西,如實(shí)體和實(shí)體引用。這樣使得LINQ to XML的操作速度更快并且更方便。以下的幾個例子將展示給大家LINQ to XML如何完成節(jié)點(diǎn)名稱修改,增加和刪除的效果。
首先,我們看一下添加一個節(jié)點(diǎn)到XML中是這么樣實(shí)現(xiàn)的:
- XElement xelem = XElement.Load(@"example.xml");
 - XElement newnewXelem = new XElement("NewNode", "This is new node");
 - xelem.Add(newXelem);
 
相當(dāng)?shù)暮唵?,只要先生成一個XElement對象然后把它Add到當(dāng)前節(jié)點(diǎn)對象就可以了。進(jìn)一步我們仔細(xì)查看一下XElement可以添加節(jié)點(diǎn)的方法。可以看到一共有Add, AddAfterSelf, AddAnnotation, AddBeforeSelf, AddFirst這五個方法。在默認(rèn)情況下,Add的操作是將新節(jié)點(diǎn)作為被插入節(jié)點(diǎn)的***一個孩子節(jié)點(diǎn)插入的,而AddFirst正好相反。AddAfterSelf和AddBeforeSelf則是將節(jié)點(diǎn)作為兄弟節(jié)點(diǎn)插入的,這里要注意的是調(diào)用這兩個方法的時候不能以根節(jié)點(diǎn)作為被插入節(jié)點(diǎn),因為XML文檔規(guī)定只能有一個根節(jié)點(diǎn)。***,我們來看一下AddAnnotation這個方法。
AddAnnotation是為一個節(jié)點(diǎn)添加一個相關(guān)的評注的類對象。這個類對象可以用戶自己定義,所以通過這個方法我們可以擴(kuò)展XML文檔對象的功能,例如根據(jù)節(jié)點(diǎn)來獲取類對象的功能。下面是一段引用自msdn的代碼:
- public class MyAnnotation
 - {
 - private string tag;
 - public string Tag { get { return tag; } set { tag = value; } }
 - public MyAnnotation(string tag)
 - {
 - this.tag = tag;
 - }
 - }
 - … …
 - MyAnnotation ma = new MyAnnotation("T1");
 - XElement root = new XElement("Root", "content");
 - root.AddAnnotation(ma);
 - MyAnnotation ma2 = (MyAnnotation)root.Annotation<MyAnnotation>();
 
【編輯推薦】















 
 
 
 
 
 
 