LINQ to XML
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文件结构,如下所示:
<?
xml version="1.0" encoding="utf-8"
?>
-
<
Users
>
-
<
User
ID
="
222221
"
>
<
name
>
EricSun
</
name
>
<
password
>
123456
</
password
>
<
description
>
Hello I'm from Dalian
</
description
>
</
User
>
-
<
User
ID
="
222222
"
>
<
name
>
Ray
</
name
>
<
password
>
654321
</
password
>
<
description
>
Hello I'm from Jilin
</
description
>
</
User
>
</
Users
>
用我的上篇文章也能够很容的实现,不过下面我要用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文件的节点信息之后,对相应节点信息做相应的修改,就显得很容易了。请看如下代码: void
ModifyXmlNodeInforOld(
6
myXDoc.Element(
"
).Element(
"
).Attribute(
"
).Value
=
777777
"
;
in myXDoc.Element( " ).Elements( 9 node.SetValue( Hello,I'm from China. 10 } 11 myXDoc.Save(xmlPath); 12 } 14 { 15 Console.WriteLine(ex.ToString()); 17 } 18 19 void ModifyXmlNodeInformation( 20 { 21 22 { 24 查询语句: 获取ID属性值等于"222222"或者等于"777777"的所有User节点(或条件用"||"符号连接) 26 where target.Attribute( " ).Value == 222222 " || target.Attribute( 28 select target; 遍历所获得的目标节点(集合) 31 { 将description节点的InnerText设置为"Hello,I'm from USA." 33 node.Element( " ).SetValue( 34 } 35 保存对xml的更改操作 36 rootNode.Save(xmlPath); 37 } 38 39 { 40 Console.WriteLine(ex.ToString()); 41 } 42 } 这里也用了两种方法去获取相应节点信息的,具体过程请看代码就可以啦。 ④:【向xml文件添加节点信息】下面的代码是向原有xml文件中添加一个节点 void
AddXmlNodeInformation(
5
6
定义一个新节点
8
XElement newNode
=
new
XElement(
new
XAttribute(
999999
"
),
9 Rose 10 456123 " )); 将此新节点添加到根节点下 13 rootNode.Add(newNode); 14 15 21 } 简单做一个总结:下面的方法将子内容添加到 XElement 或 XDocument 中: 方法 说明 Add 在 XContainer 的子内容的末尾添加内容。 AddFirst 在 XContainer 的子内容的开头添加内容。 下面的方法将内容添加为 XNode 的同级节点。 向其中添加同级内容的最常见的节点是 XElement,不过你也可以将有效的同级内容添加到其他类型的节点, 例如 XText 或 XComment。 AddAfterSelf 在 XNode 后面添加内容。 AddBeforeSelf 在 XNode 前面添加内容。
⑤:【删除指定xml文件的节点信息】如何将刚刚加入的那个节点删除掉呢?请看如下代码: void
DeleteXmlNodeInformation(
查询语句: 获取ID属性值等于"999999"的所有User节点
10
select target;
11 将获得的节点集合中的每一个节点依次从它相应的父节点中删除 targetNodes.Remove(); 21 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- PostgreSQL发现重复记录
- swift3.0 去掉字符串中的百分号
- ios – 如何在Xcode的Safari中打开webview中的任何链接?
- 正则表达式模式修饰符
- RNSound.IsAndroid错误(React Native)
- objective-c – NSURLSessionDataTask不执行完成处理程序块
- Swift Playground中的NSTimer.scheduledTimerWithTimeInter
- swift – 让我们为多个视图控制器创建MVC,Singletons和数据
- c# – 在运行时将项目添加到RibbonDropDown
- sqlite3自增key设定(创建自增字段)