LINQ學習心得分享--------(四)LINQ TO XML實用解析


     在開始將之前,先請大家看一下本節的標題,沒錯!是"LINQ TO XML實用解析",所以在這一節里我會以實用為主,向大家一步一步講解LINQ TO XML的知識。

     首先解釋一下什么是LINQ to XML?LINQ to XML 是一種啟用了 LINQ 的內存 XML 編程接口,使用它,可以在 .NET Framework 編程語言中處理 XML。 LINQ to XML之前,我們主要通過XML DOM來創建XML文檔對象。下面我給大家演示一下如何通過XML DOM創建文檔對象。

示例:

private static void UserXMLDOMCreateXML()

        {

            XmlDocument xDocument = new XmlDocument();

            XmlElement xRoot = xDocument.CreateElement("Persons");

            XmlElement xPerson = xDocument.CreateElement("Person");

            XmlElement xPName = xDocument.CreateElement("Name");

            xPName.InnerText = "Olive"; 

            XmlElement xAge = xDocument.CreateElement("Age");

            xAge.InnerText = "22";

            XmlElement xPerson1 = xDocument.CreateElement("Person");

            XmlElement xPName1 = xDocument.CreateElement("Name");

            xPName1.InnerText = "Ares";

            XmlElement xAge1 = xDocument.CreateElement("Age");

            xAge1.InnerText = "23";

            XmlElement xPerson2 = xDocument.CreateElement("Person");

            XmlElement xPName2 = xDocument.CreateElement("Name");

            xPName2.InnerText = "Only";

            XmlElement xAge2 = xDocument.CreateElement("Age");

            xAge2.InnerText = "23";

            XmlElement xPerson3 = xDocument.CreateElement("Person");

            XmlElement xPName3 = xDocument.CreateElement("Name");

            xPName3.InnerText = "Love";

            XmlElement xAge3 = xDocument.CreateElement("Age");

            xAge3.InnerText = "23";

            xPerson.AppendChild(xPName);

            xPerson.AppendChild(xAge);

            xRoot.AppendChild(xPerson);

            xPerson1.AppendChild(xPName1);

            xPerson1.AppendChild(xAge1);

            xRoot.AppendChild(xPerson1);

            xPerson2.AppendChild(xPName2);

            xPerson2.AppendChild(xAge2);

            xRoot.AppendChild(xPerson2);

            xPerson3.AppendChild(xPName3);

            xPerson3.AppendChild(xAge3);

            xRoot.AppendChild(xPerson3);

            xDocument.AppendChild(xRoot);

            xDocument.Save(@"D:\LinqToXml.xml");

        }

結果如下:

下面再使用LINQ To XML的方式,創建一個XML文檔對象。

示例:

 private static void UseLINQXMLCreateXML()

        {

            XElement xElement = new XElement("Persons",

                new XElement("Person",

                    new XElement("Name","Olive"),

                    new XElement("Age","22")),

                new XElement("Person",

                    new XElement("Name","Ares"),

                    new XElement("Age","23")),

                new XElement("Person",

                    new XElement("Name","Only"),

                    new XElement("Age","23")),

                new XElement("Person",

                    new XElement("Name","Love"),

                    new XElement("Age","22"))

            );

            xElement.Save(@"D:\LINQ To XML.xml");

        }

結果如下:

 

通過以上結果可以發現,我們通過Linq To XML的方式創建XML文檔對象,比XML DOM方式要剩下很多的代碼,使用起來也更方便、高效。

好了,通過這個例子我想你已經基本上學會了使用LINQ TO XML的方式創建XML文檔,但是還有一些相關的東西,讓我來為你細細道來。

我們看一般的XML文件里邊都有注釋,如果我們想要為我們所創建的文檔添加注釋該怎么辦呢?

請看示例:

剛剛我們已經創建了XML文檔對象,可是如果需求有變化需要向該對象添加新的子項這時該怎么辦呢?

我們可以同過XElement.Add()的方法向XML文檔對象添加新元素

請看示例:

   private static void AddNewXMLItem()

        {

           

            XElement xe = new XElement("Pseron",new XElement("Name", "Remote"),new XElement("Age", "23"));

            xElement.Add(xe);

            xElement.Save(@"D:\LINQ To XML.xml");

            Console.WriteLine("元素添加成功!");

        }

結果如下:

 

由此可知通過XElement.Add()方法,可以像XML文檔對象添加新的元素,但是添加的元素,默認都添加在文檔對象的末尾,如果想要添加到文檔開頭怎么辦呢?

可以使用XElement.AddFirst()方法

示例:

XElement xe = new XElement("Pseron",new XElement("Name", "Snow"),new XElement("Age", "23"));

            xElement.AddFirst(xe);

            xElement.Save(@"D:\LINQ To XML.xml");

            Console.WriteLine("元素添加成功!");

結果:

 

除此之外還有AddAfterSelf()和AddBeforeSelf()方法,作用分別是:緊跟在此節點之后(之前)添加指定的內容。這里就不再做示例了。

說完了添加,如果要刪除元素該怎么辦呢?

通常我們會用XElement.Remove()方法或者XElement.RemoveAll()(為刪除所有元素)

請看下面的示例:

//刪除XML文檔對象的第一元素

xElement.Elements("Person").First().Remove();

結果:

 

//刪除XML文檔對象中Name元素值為Ares<Person>節點

  xElement.Elements("Person").Elements("Name").Where(p => p.Value == "Ares").Remove();

結果:

 

和上邊的結果圖對比可知Name"Ares"的節點已經被刪除了。

同樣,如果我們想要查找某個節點也可這樣做。請看上示例:

//查詢XML文檔對象中Name元素的值為“Love”的<Person>節點,並將其內容輸出

示例: private static void SerachXMLItem()

        {

            Console.WriteLine("查詢結果:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine(x.ToString());

        }

結果:

 

學會了查找,修改XML文檔對象的指定內容就更加容易了。

////查詢XML文檔對象中Name元素的值為“Love”的<Person>節點,並將其內容做如下修改,<Name>Momo</Name>,<Age>22</Age>

示例:

 private static void SerachXMLItem()

        {

            Console.WriteLine("查詢結果:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("修改前查詢到的信息:");

            Console.WriteLine(x.Element("Name").ToString());

            Console.WriteLine(x.Element("Age").ToString());

            x.Element("Name").Value = "MoMo";

            x.Element("Age").Value = "22";

            Console.WriteLine("修改后的結果:");

            Console.WriteLine(x.ToString());

        }

結果:

 

原來Name值為LoveXML文檔的最后,修改后Name值成為了"Momo"

至此,我想大家已經學會了Linq To XML的基本的增刪改查新建等一些的操作,你有沒有發現這里邊用到了很多我們在開始這個系列課程學習時,學習的一些C#3.0的新特性呢,Lamdba在這里用的比較多,還有一些Linq的查詢函數用到的之前講的擴展方法,但是這些還遠遠的不夠,在下面,我會仔細的把一些相關Linq To XML的東西再深入的講解一下。

在實際的開發中可能需要為某些特定的元素添加一些額外的屬性,通過下邊的這個示例,我會向你展示,添加、修改、刪除屬性的方法。

示例:

//Name值為LovePerson添加地址屬性,屬性值為“北京”

    Console.WriteLine("為特定的元素添加地址屬性:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

             x.SetAttributeValue("Address", "北京");

             Console.WriteLine(x.ToString());

結果:

 

示例:

//修改Name值為LovePerson的地址屬性,修改屬性值為“鄭州”

示例:

 private static void ChangeAttribute()

        {

            Console.WriteLine("修改特定元素的地址屬性:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            x.SetAttributeValue("Address", "鄭州");

            Console.WriteLine(x.ToString());

        }

結果:

 

如果想要刪除屬性的話,也很簡單,只需要將要刪除的屬性值設為null就可以了

示例:

 private static void DeleteAttribute()

        {

            Console.WriteLine("刪除特定屬性");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            x.SetAttributeValue("Address", null);

        }

結果:

 

總而言之,與屬性有關的操作都在XElement.SetAttributeValue()這個方法里。

在有些時候我們想要替換文檔對象中的某些元素,請注意是“替換”而不是修改,那么你可以這樣做:

示例: 使用ReplaceAll()替換元素

private static void ReplaceXElement()

        {

            Console.WriteLine("ReplaceAll()替換特定元素");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("替換前");

            Console.WriteLine(x.ToString());

            x.ReplaceAll("O(_)O哈哈~");

            Console.WriteLine("替換后");

            Console.WriteLine(x.ToString());

        }

結果:

 

示例:將特定的元素替換為一個新的元素 

private static void ReplaceXElement()

        {

            Console.WriteLine("ReplaceAll()替換特定元素");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("替換前");

            Console.WriteLine(x.ToString());

            x.ReplaceWith(new XElement("ZhiYe",

                                    new XElement("Name","Olive"),

                                    new XElement("Job","Sudent")));

        }

結果:

 

以上我們講的這些都是在新建的文檔對象里進行的操作,有時候我們可能會需要從已存在的文檔中加載文檔內容,一般可以通過XDocument類的靜態的Load()方法,也可以通過使用XElement.Load()方法來完成這樣的操作。XElementLoad方法是一種輕量級的方法,不需要新建文檔對象,使用起來也比較方便,所以下面的示例就主要將一下使用XElement.Load()方法來加載已存在的文檔。

private static void XElementLoad()

        {

            XElement root= XElement.Load(@"D:\LINQ To XML.xml");

            XElement x=  root.Elements("Person").Where(p => p.Element("Name").Value == "Olive").FirstOrDefault();

            Console.WriteLine(x.ToString());

        }

結果:

 

在實際的開發中我們可能會需要從現有的XML文檔中讀取信息,然后和返回相應的信息集合,在WindowsPhone 7的開發中,有時候我們就需要加載本地的XML數據,然后返回數據集合與ListBox進行綁定。

下邊就做這樣一個獲取數據集合的小例子:

首先根據XML的結構特點創建一個相應的Person類:

public class Person

   {

       public string Name{get;set;}

       public string Age{get;set;}

   }

示例:返回數據集合

private static void JiHe()

        {

             //xml文檔讀取信息,並轉換為相應的Person類集合

            List<Person> psersonList = XElement.Load(@"D:\LINQ To XML.xml").Elements("Person").Select(p => new Person

            {

                Name = p.Element("Name").Value,

                Age = p.Element("Age").Value

            }).ToList();

            Console.WriteLine("輸出從XML文檔中讀取的集合對象!");

            foreach (Person p in psersonList)

            {

                Console.WriteLine("姓名:" + p.Name + "   年齡:" + p.Age);

            }

        }

結果:

 

好了,到這里已經把比較實用的Linq To Xml操作的所有方法都講過了,希望可以對大家有所幫助,這里主要以實用為主,當然還有其他的一些方法和相關的操作類都沒有講到,如果有興趣的朋友可以自己去關注一下。下一節,主要會將Linq To Sql的操作,這個也是比較常用和重要的。希望大家多多指導!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM