zoukankan      html  css  js  c++  java
  • 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节点值。

  • 相关阅读:
    frp 多个web服务内网映射外网IP
    vue 组件和路由 cdn引入方式的写法。。。。
    Http/Https面试题整理+三次握手四次挥手
    推荐系统的工程实现
    Testner读书会暨公益图书馆项目正式启动
    学习算法
    工作流开源任务调度框架2--Azkaban
    工作流开源调度框架1- airflow
    Testner软件质量与测试创新研究中心总部落地长沙
    企业的八大类别36种盈利模式
  • 原文地址:https://www.cnblogs.com/Ksloveyuan/p/3364342.html
Copyright © 2011-2022 走看看