我的上一篇文章描述了用普通方法实现对xml文件的基本操作,感谢各位园友给我提的每一个建议,大家主要在说:用Linq去实现对xml的操作更加方便简洁,于是乎我就现学习了一下Linq to xml,由于是刚刚接触Linq,理解肯定不会很深,所以请各位园友不吝赐教,有建议尽管说,在此先谢过大家啦~
LINQ to XML 为创建 XML 元素提供了一种称为“函数构造”的有效方式。函数构造是指在单个语句中创建 XML 树的能力。
启用函数构造的 LINQ to XML 编程接口有几个重要功能:
XElement 构造函数可以对内容采用多种类型的参数。 例如,可以传递另一个 XElement 对象,该对象将成为一个子元素。 可以传递一个 XAttribute 对象,该对象将成为该元素的一个属性。 也可以传递任何其他类型的对象,该对象将转换为字符串并成为该元素的文本内容。
XElement 函数采用类型为 Object 的 params 数组,因此可以向该构造函数传递任意数目的对象。 这使您可以创建具有复杂内容的元素。如果对象实
现 IEnumerable<T>,则枚举对象中的集合,并添加集合中的所有项。
如果集合包含 XElement 或 XAttribute 对象,则单独添加集合中的每一项。这一功能很重要,因为它允许您将 LINQ 查询的结果传递给构造函数。
本文的主要模块为:
① :生成xml文件
② :遍历xml文件的节点信息
③ :修改xml文件的节点信息
④ :向xml文件添加节点信息
⑤ :删除指定xml文件的节点信息
①:【生成xml文件】假设我们想生成这样的一个xml文件结构,如下所示:
用我的上篇文章也能够很容的实现,不过下面我要用Linq to xml的方式实现生成这个xml文件,请看下面代码:
②:【遍历xml文件的节点信息】创造出了xml文件之后,我们就要知道如何获得xml文件的各个节点的信息,请看如下代码:
上面用了两种方法去实现对xml文件节点信息的读取,第一种方法是那种比较老的模式:通过父节点获得它的子节点(一层一层的获得),然后获取目标节点的信息;第二中方法用到的是Linq to xml的查询模式,根据我们的需求获得符合条件的所有节点,然后对这些节点的信息进行读取。
接下来我们要简单的讲述一下Linq to xml的查询模式(语法一看便懂,这里就不过多阐述了),LINQ to XML 的一个最重要的性能优势(与 XmlDocument 相比)为:LINQ to XML 中的查询是静态编译的,而 XPath 查询则必须在运行时进行解释,此功能是 LINQ to XML 的内置功能。
在调试程序的时候我们发现,第二种方法的IEnumerable<XElement> targetNodes = from target in rootNode.Descendants("name") select target;的这句话执行完毕后,得到的targetNodes依然是null,直到遍历的时候才获得相应的对象信息,这种方式就做延迟执行,【延迟执行】:意味着表达式的计算延迟,直到真正需要它的实现值为止。 当必须操作大型数据集合,特别是在包含一系列链接的查询或操作的程序中操作时,延迟执行可以大大改善性能。 在最佳情况下,延迟执行只允许对源集合的单个循环访问。
【注:查询条件写在where语句中,并列条件用"&&"符号连接,或条件用"||"符号连接】
③:【修改xml文件的节点信息】知道了如何查询xml文件的节点信息之后,对相应节点信息做相应的修改,就显得很容易了。请看如下代码:
这里也用了两种方法去获取相应节点信息的,具体过程请看代码就可以啦。
④:【向xml文件添加节点信息】下面的代码是向原有xml文件中添加一个节点
简单做一个总结:下面的方法将子内容添加到 XElement 或 XDocument 中:
方法 说明
Add 在 XContainer 的子内容的末尾添加内容。
AddFirst 在 XContainer 的子内容的开头添加内容。
下面的方法将内容添加为 XNode 的同级节点。 向其中添加同级内容的最常见的节点是 XElement,不过你也可以将有效的同级内容添加到其他类型的节点,
例如 XText 或 XComment。
方法 说明
AddAfterSelf 在 XNode 后面添加内容。
AddBeforeSelf 在 XNode 前面添加内容。
⑤:【删除指定xml文件的节点信息】如何将刚刚加入的那个节点删除掉呢?请看如下代码:
至此,我们就完成对xml文件的基本操作:创建、读取、修改、添加、删除。由于刚刚学习Linq,理解的很浅显,如有不合适的地方,欢迎大家指出~~