这节将学习如何用 linq查询xml
一、我们先看看在xml中我们怎么操作
public void xmlWayToQueryXmlFile() { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load("../../xmlFile.xml"); XmlNode root = xmldoc.DocumentElement; XmlNode node = root.SelectSingleNode("custom[id='100']"); Console.Write(node.InnerText); }
这是在using system.xml条件下查询xml中id=100的node下所有的innerText
关于在xml中查询方法,这里讲的比较详细http://www.cnblogs.com/fjsnail/archive/2012/10/20/2732127.html
二、我们看看用linq又怎么操作
函数一: Elements()返回XML文档或片段中的所有第一级元素。对于有效的XML文档,例如,刚才创
建的NorthwindCustomerOrders.xml文件,只有一个第一级元素,即根元素customers
public void queryXml() { string filePath = "../../xmlFile.xml"; XDocument xdoc = XDocument.Load(filePath); var result = from item in xdoc.Elements() select item.Name; foreach(var i in result) { Console.WriteLine(i); } }
当时如果把select item.Name 改为select.value 则显示的是所有innerText,如果改为select item ,那么显示是所有xml文档
函数二:Descendants()返回XML文档或片段中的所有子元素(所有级别的子元素)
public void queryXmlByDescendants() { string filePath = "../../xmlFile.xml"; <custom> XDocument xdoc = XDocument.Load(filePath); <id>1</id> <name>gougou</name> var result = from item in xdoc.Descendants() <age>23</age> // select item.Value; //显示所有子元素的值 </custom> select item.Name; //显示所有子元素的标签 foreach (var i in result) { Console.WriteLine(i); } }
注意:select item.Value时,如果xml像上面右侧那样 显示的结果是1gougou23 1 gougou 23 (应该是先显示custom级的value,把下面的子节点value全部显示出来,再循环到下面的子节点,显示单个子节点的value)
当然可以加distict 除掉重复的值
foreach (var i in result.Distinct())
{
Console.WriteLine(i);
}
这样就可以显示所有id的值
var result = from item in xdoc.Descendants("id") select item.Value; //显示所有子元素的值
函数三 Attributes(),它返回当前选中元素的所有特性
对于行如这样的xml
<custom sequence="1" boolChange="false"> <id>0</id> <name>nihao</name> <age>112</age> </custom>
public void queryXmlByAttributes() { string filePath = "../../xmlFile.xml"; XDocument xdoc = XDocument.Load(filePath); var result = from item in xdoc.Descendants("custom").Attributes() select item; //显示所有子元素的值 foreach (var i in result) { Console.WriteLine(i); } }
上面代码显示的是:sequence="1"boolChange="false"
如果把 select item改为select item.name 则输出:sequence boolchange
如果该为select item.value 则输出1 false
总结:xml的操作方法有多种,不仅可以用xml 本身提供的api,还可以用linq to xml ,各有各的好处,相比二样linq更方便
在使用之前,记得要添加:
using System.Linq; using System.Xml.Linq
using System.Xml;