在向大家详细介绍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表达式来实现的,因此上面的代码运行结果等同于下面的代码:
- 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");
- // 查询节点名为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的操作进行了扩展,这个扩展就是LINQ to XML。在名称空间System.Xml.LINQ下。从以上的代码我们可以看到增加了一个新的XElement对象。我们通过XElement.Load方法来装载XML文档,而不是传统的DOM模式XmlDocument.Load。
相比较于W3C的DOM文档结构来说,LINQ to XML为我们提供了一种更方便的创建一个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")
- )
- );
- 输出结果:
- <? 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提供了为丰富并且简洁的类来实现对XML的操作。相对于种类繁多的DOM模型的XML类库而言,LINQ的类使我们的学习曲线变得平滑并且还能达到相同的效果。LINQ to XML解决了DOM模型中的几个比较不方便的问题,如修改节点名字的问题;同时也抛弃了一些看起来很强大但是很不常用的东西,如实体和实体引用。这样使得LINQ to XML的操作速度更快并且更方便。以下的几个例子将展示给大家LINQ to XML如何完成节点名称修改,增加和删除的效果。
首先,我们看一下添加一个节点到XML中是这么样实现的:
- XElement xelem = XElement.Load(@"example.xml");
- XElement newnewXelem = new XElement("NewNode", "This is new node");
- xelem.Add(newXelem);
相当的简单,只要先生成一个XElement对象然后把它Add到当前节点对象就可以了。进一步我们仔细查看一下XElement可以添加节点的方法。可以看到一共有Add, AddAfterSelf, AddAnnotation, AddBeforeSelf, AddFirst这五个方法。在默认情况下,Add的操作是将新节点作为被插入节点的***一个孩子节点插入的,而AddFirst正好相反。AddAfterSelf和AddBeforeSelf则是将节点作为兄弟节点插入的,这里要注意的是调用这两个方法的时候不能以根节点作为被插入节点,因为XML文档规定只能有一个根节点。***,我们来看一下AddAnnotation这个方法。
AddAnnotation是为一个节点添加一个相关的评注的类对象。这个类对象可以用户自己定义,所以通过这个方法我们可以扩展XML文档对象的功能,例如根据节点来获取类对象的功能。下面是一段引用自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>();
【编辑推荐】