1. 程式人生 > >LINQ to XML簡介

LINQ to XML簡介

console oid 中新 tps tro process 技術分享 from person

我們的配置文件使用XML存儲信息。ADO.NET的DataSet(利用擴展方法)可以方便的將數據保存(或加載)為XML。.NET特有的XML API,如XmlReader/XmlWriter類。微端提供了一個特殊的程序集 System.Xml.dll專門對XML文檔進行編程。因為LINQ操作數據比較方便,所有大多數人選擇使用Linq to XML API來於XML數據進行交互。

傳統的XML寫法

XmlElement類的介紹

這個用法就跟用JavaScript在頁面上創建元素一樣的

            //在內存中新建一個Xml文檔
            XmlDocument doc = new
XmlDocument(); //穿件元素 <inventory> XmlElement inventory = doc.CreateElement("Inventory"); //創建<Car>子元素 包含一個ID特性 XmlElement car = doc.CreateElement("Car"); car.SetAttribute("ID", "1000"); //創建Car元素中的數據 XmlElement name = doc.CreateElement("
PetName"); name.InnerText = "Jimbo"; XmlElement color = doc.CreateElement("Color"); color.InnerText = "Red"; XmlElement make = doc.CreateElement("Make"); make.InnerText = "Ford"; //將<PetName><Color><Make>
car.AppendChild(name); car.AppendChild(color); car.AppendChild(make); //將<Car>元素添加到<Inventory>元素 inventory.AppendChild(car); //將完整的XML插入到XmlDocument對象並保存文件 doc.AppendChild(inventory); doc.Save("Inventory.xml");

技術分享

更優秀的Dom———Linq to XML

System.XML.Linq包含了一組非常易於管理的類,它們代表一個XML文檔的不同方面(元素、屬性、XML命名控件、XML註釋、處理指令等)

    //註意把格式調一下,可以看的很清除
            XElement doc = new XElement("Inventory",
                         new XElement("Car", new XAttribute("ID", "1000"),
                             new XElement("PetName", "Jimbo"),
                             new XElement("Color", "Red"),
                             new XElement("Color", "Ford")
                          )
                        );

技術分享

這樣對比一下,下面的一種更簡些。

System.Xml.Linq 命名空間的成員

LinQ to XML的核心程序集(System.Xml.Linq.dll)只在三個不同空間下定義了很少的類型。這 三個命名空間是 System.Xml.Linq、System.Xml.Schema、System.Xml.xPath.

System.Xml.Linq命名空間的成員

技術分享

技術分享

技術分享

技術分享

LINQ to XML的軸方法

除這些X*類,System.Xml.Linq中還定義了一個名為Extensions的類,它還定義了一組針對IEnumerable<T>的擴展方法,其中為XNode或XContainer的子類。

LINQ to XML的Extensions類的Selecr成員

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

技術分享

這些方法允許在一個已加載的XML樹中進行查詢。以查找元素、特性以及他們的值。這麽方法被稱為軸方法(axis method)或簡稱軸。抽象類XContainer類支持很多於Extensions方法的名稱相同的方法。由於XContainer是XElement和XDocument的父類,所以都支持全部的功能。

例如:

  XElement doc = new XElement("Inventory",
                         new XElement("Car", new XAttribute("ID", "1000"),
                             new XElement("PetName", "Jimbo"),
                             new XElement("Color", "Red"),
                             new XElement("Color", "Ford")
                          )
                        );

            doc.Descendants("PetName").Remove(); //先找到該元素再刪除,Linq一樣
            doc.Save("InventoryWithLinq1.xml");

技術分享

奇妙的XName和XNamespace

Desendants<XName name>

技術分享

相反,此類提供了隱式轉換 String ,允許您創建 XName.他會將一個簡單的System.String映射到正確的XName對象。XNamespace一樣。

使用XElement和XDocument

XDocument表示整個XML文檔。它可以用來定義一個根元素及其包含的所有元素、處理指令和XML聲明。

            XDocument inventroyDoc = new XDocument(
                new XDocument(
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XComment("Current Inventroy of cars"),
                    new XProcessingInstruction("xml-stylesheet", "href=‘MyStyless.css‘ title=‘Compact‘ type=‘text/css‘"),
                    new XElement("Inventory",
                    new XElement("Car", new XAttribute("ID", "1"),
                        new XElement("Color", "Green"),
                        new XElement("Make", "BWM"),
                        new XElement("PetName", "stan")
                     ),
                    new XElement("Car", new XAttribute("ID", "2"),
                        new XElement("Color", "Pink"),
                        new XElement("Make", "Yugo"),
                        new XElement("PetName", "Melvin")
                    )

                    )
                ));
            inventroyDoc.Save("test.xml");

技術分享

可以簡單的就用XElement來創建XML元素。

從數組和容器中生成文檔

讀取數據身材XElement(或XDocument).

//創建一個匿名類型的數組
            var people = new[]{
                 new {FirstName="Mandy",Age=18},
                 new {FirstName="Andrew",Age=19},
                 new {FirstName="Dave",Age=20},
                 new {FirstName="Sara",Age=21},
                };

            XElement peopleDoc = new XElement("Perple", from c in people select new XElement("Person", new XAttribute("Age", c.Age), new XElement("FirstName", c.FirstName))
                );

            //或者  都會得到相同的結果
            var arrayDataAdsXlements = from c in people select new XElement("Person", new XAttribute("Age", c.Age), new XElement("FirstName", c.FirstName));
            XElement peopleDoc2 = new XElement("People", arrayDataAdsXlements);

            peopleDoc.Save("one.xml");
            peopleDoc2.Save("two.xml");

技術分享

加載和解析XML內容

XElement和XDocument都支持Load()和Parse()方法,可以從包含XML數據的string對象或外部XML文件中獲取XML對象模型。

 string myElement =
                @"<Car ID=‘3‘>
                    <Color>Yellow</Color>
                    <Make>Yugo</Make>
                    </Car>";
            XElement newElement = XElement.Parse(myElement);
            Console.WriteLine(newElement);

            Console.WriteLine();
            XDocument myDoc = XDocument.Load("one.xml");
            Console.WriteLine(myDoc);

技術分享

定義LINQ to XML輔助類

public static void InsertNewElement(string make, string color, string petName)   //一個添加的方法
        {
            XDocument inventoryDoc = XDocument.Load("test.xml");
            Random r = new Random();
            XElement newElement = new XElement("Car",
                new XAttribute("ID", r.Next(5000)),
                    new XElement("Color", color),
                    new XElement("Make", make),
                    new XElement("PetName", petName));

            inventoryDoc.Descendants("Inventory").First().Add(newElement);
            inventoryDoc.Save("test.xml");
        }

原:

技術分享

運行該方法:

技術分享

技術分享

查詢:

技術分享

LINQ to XML簡介