zoukankan      html  css  js  c++  java
  • 用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也可以解决这样的取值问题,但是会变得复杂很多。

  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/leco/p/1882216.html
Copyright © 2011-2022 走看看