LINQ to XML簡介
我們的配置文件使用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 = newXmlDocument(); //穿件元素 <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簡介