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

posted @ 2010-11-19 22:10  leco_lin  阅读(3756)  评论(0编辑  收藏  举报