• 用C#读取XML指定节点下的值


    -------------------XML code
    <Employees>
      <Employee name="李宇秋" age="23">
        <Address>
           长江路178号
        </Address>
        <Department>
           演唱部
        </Department>
      </Employee>
      <Employee name="曾不可" age="24">
        <Address>
           火星路239号
       </Address>
        <Department>
           舞蹈部
       </Department>
      </Employee>
      <Employee name="张学敌" age="27">
        <Address>
           香港街13号
       </Address>
        <Department>
           偶像部
       </Department>
      </Employee>
    </Employees>
    
    --------------比如:要获取 name="曾不可" 的节点下面的 Address 节点的值“火星路239号”,C#如何实现?

    OK,在linq之前,可以试用XMLDocment将xml整个文件读进来,然后比如可以用xpath再进行分析。
    自从有了linq,一切都变得简单了,实现代码如下:

    //假设以上xml我们保存在一个本地xml文件 D:\Microsoft Work\XMLPath\sampleXML.xml 中
    public List<string> GetXMLResult()
    {
           XElement xelement = XElement.Parse(@"D:\Microsoft Work\XMLPath\sampleXML.xml");
           var query = xelement.Descendants("Employee").Where(x => x.Attribute("name").Value == "曾不可").Select(x => x.Element("Address").Value);
           if (query != null && query.Count() > 0)
                 return query.ToList<string>();
    
           return null;
    }
    

    这样即可。

    OK,我们现在将上面的XML结构稍作改动一下,

    -------------------XML code
    <Employees>
      <Employee name="李宇秋" age="23">
        <Address>
           <Province>
              长江省
           </Province>
           <Road>
              长江路178号
         </Road>
       </Address>
        <Department>
           演唱部
        </Department>
      </Employee>
      <Employee name="曾不可" age="24">
         <Address>
           <Province>
              火星省
         </Province>
           <Road>
              火星路239号
         </Road>
        <Address>
        <Department>
           舞蹈部
       </Department>
      </Employee>
      <Employee name="张学敌" age="27">
        <Address>
           <Province>
              香港省
         </Province>
           <Road>
              香港街239号
         </Road>
        <Address>
        <Department>
           偶像部
       </Department>
      </Employee>
    </Employees>
    
    --------------现在:仍然是要获取 name="曾不可" 的节点下面的 Address 节点下Road结点的值“火星路239号”,
    --------------C#如何实现?

    OK,这时候linq的优势就很明显了,实现代码如下:

    private List<string> GetXMLResult(string xmlPath, string employeeName)
    {
         XElement xelement = XElement.Load(xmlPath);
         var query = xelement.Descendants("Employee").SingleOrDefault(x => x.Attribute("name").Value == employeeName);
         if (query != null && query.Count() > 0)
         {
             var queryResult = query.Descendants("Road").Select(m => m.Value);
             if (queryResult.Count() > 0)
                return queryResult.ToList<string>();
         }
         return null;
    }

    如果没有Linq To XML,用xpath也可以解决这样的取值问题,但是会变得复杂很多。

  • 相关阅读:
    有序数组中找中位数
    卡特兰数 catalan number
    海量数据等概率选取问题
    求字符串中最长无重复字符的子串
    Linux的进程通信(IPC)
    Linux多线程编程
    后缀数组处理字符串的利器
    网络编程socket基本API详解
    Windows线程的创建与终止
    《算法导论》读书笔记之第10章 基本数据结构之二叉树
  • 原文地址:https://www.cnblogs.com/leco/p/1882216.html
Copyright © 2020-2023  润新知