一、简介
LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语言方面的改进。
LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。 由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。 Visual C# 2008 集成 LINQ 后,可提供更强的类型化功能、编译时检查和改进的调试器支持。
通过将查询结果用作 XElement 和 XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。 这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。
二、载入文档
可以通过XDocument或XElement的静态方法Load载入xml文档,Load可以接受URI字符串,TextReader,XmlReader作为输入源。还可以使用静态方法Parse把字符串转变为待查询的xml文档。XDocument和XElement的区别在于查询时,XElment可以跳过根几点直接查询。
//从文件载入 XDocument myPets = XDocument.Load("MyPets.xml"); //从http载入天气预报 string weatherWebService = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=58367"; XDocument weather = XDocument.Load(weatherWebService); XElement weatherElement = XElement.Load(weatherWebService);
三、查询XML文档
待查询的xml文档
<?xml version="1.0" encoding="utf-8"?> <pets> <pet> <id>2</id> <name>Dog</name> <species>Some Kind of Cat</species> <sex>Female</sex> <startYear>1972</startYear> <endYear>1974</endYear> <causeOfDeath>Car</causeOfDeath> <specialQuality>Best mouser</specialQuality> </pet> <pet> <id>3</id> <name>Sam</name> <species>Labrador</species> <sex>Female</sex> <startYear>1973</startYear> <endYear>1980</endYear> <causeOfDeath>Old Age</causeOfDeath> <specialQuality>Great hunting dog</specialQuality> </pet> </pets>
载入文档后,XDocument或XElement的Elements()方法执行时返回IEnumrable<XElement>类型的子节点信息,Element()方法返回唯一的子节点信息。
查找所有pet的name。分别使用XDocument和XElement查找。
XDocument document = XDocument.Load("MyPets.xml"); XElement element = XElement.Load("MyPets.xml"); var name = from pet in document.Elements("pets").Elements("pet") select pet.Element("name").Value; var pets = from pet in element.Elements("pet") select pet; Array.ForEach(pets.ToArray(), p=>Console.WriteLine(p.Element("name").Value)); Array.ForEach(name.ToArray(), n => Console.WriteLine(n));
四、修改XML文档
修改pet的id
XElement element = XElement.Load("MyPets.xml"); var query = from pet in element.Elements("pet") select pet.Element("id"); foreach (var id in query) { id.Value = Guid.NewGuid().ToString(); } element.Save("NewPets.xml");
添加节点到owner到pet
XElement element = XElement.Load("MyPets.xml"); var query = from pet in element.Elements("pet") select pet; foreach (var p in query) { XElement owner = new XElement("owner", "mshijie"); p.Add(owner); } element.Save("NewPets.xml");
删除节点
var query = from pet in element.Elements("pet") select pet; foreach (var p in query) { p.Element("owner").Remove(); } element.Save("NewPets.xml");
五、访问节点属性
XElement element = XElement.Load("MyPets.xml"); var query = from pet in element.Elements("pet") select pet; foreach (var p in query) { XAttribute attr = new XAttribute("size", "small"); p.Add(attr);//添加属性 p.Attribute("size").Remove();//删除属性 } element.Save("NewPets.xml");
六、创建xml文档
XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144", new XAttribute("Type", "Home")), new XElement("phone", "425-555-0145", new XAttribute("Type", "Work")), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042") ) ) );
XElement构造函数接受两个参数,节点名和Content,Content可以是简单字符串,也可以的属性和子节点集合。
七、处理命名空间
创建带命名空间的xml文档
XNamespace myns = "http://www.cnblogs.com/mshijie"; XElement root = new XElement(myns + "pets", new XAttribute(XNamespace.Xmlns + "myns", myns), new XElement(myns + "pet", new XElement(myns + "name", "Dog"))); root.Save("test.xml");
test.xml
<?xml version="1.0" encoding="utf-8"?> <myns:pets xmlns:myns="http://www.cnblogs.com/mshijie"> <myns:pet> <myns:name>Dog</myns:name> </myns:pet> </myns:pets>
查询
XNamespace myns = "http://www.cnblogs.com/mshijie"; XElement pets = XElement.Load("test.xml"); var query = from pet in pets.Elements(myns + "pet") select pet; Array.ForEach(query.ToArray(), p => Console.WriteLine(p.Element(myns + "name").Value));