Linq to XML 之XElement的Descendants方法的新发现

C#操作XML的方法有很多,但个人认为最方便的莫过于Linq to XML了,特别是XElement的Descendants方法是我最常用的一个方法。

这个方法可以根据节点名(Name)找到当前调用的XElement结点下所有的子XElement节点。最近,在写一个程序时时,让我有些新的发现。

示例XML文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Activity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.test.com/test">
 3   <Name>1</Name>
 4   <Activities>
 5     <Activity>
 6       <Name>2</Name>      
 7     </Activity>
 8     <Activity>
 9       <Name>3</Name>      
10     </Activity>
11   </Activities>
12 </Activity>

这是一个关于Activity结点的树形结构,每个Activity节点都有一个Name子节点。我尝试着使用下面的代码,打印出所有Activity节点的Name子节点的值。

1 var rootElement = XElement.Load("test.xml");
2 var nameNodes = rootElement.Descendants("Name");
3 
4 foreach (var nameNode in nameNodes)
5 {
6     Console.WriteLine(nameNode.Value);
7 }
8 
9  Console.ReadKey();

但是结果却是空,当时很让我吃惊,经过调试后,我才发现我略了一个地方。不知道大家注意没有,测试的XML文件的根节点是有Namespace的,调用Descendants方法的时候,即使子节点没有指定Namespace,也会被自动添加上,而XElement的Name属性,恰恰是由Namespace和节点名共同组成的。找到原因了,解决方法也就有了,只要做些小改动就好。

将代码

1 var nameNodes = rootElement.Descendants("Name");

改成

1 var nameNodes = rootElement.Descendants(rootElement.Name.Namespace + "Name");

即可。再次运行,便可打印出所有的Name节点值。

 

转载于:https://www.cnblogs.com/Ksloveyuan/p/3364342.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值