-------------------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也可以解決這樣的取值問題,但是會變得複雜很多。