C#基础巩固(3)-Linq To XML 读取XML
记录下一些读取XML的方法,以免到用的时候忘记了,还得花时间去找。
一、传统写法读取XML
现在我有一个XML文件如下:
现在我要查找名字为"王五"的这个人的 Id 和sex(性别) 和age(年龄)
代码:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加载xml List<XElement> eles = new List<XElement>(); //用来获取符合条件的节点集合 XElement ele = xdoc.Element("root"); //获取根节点 string nameTxt = "王五"; //要查找的条件 TraditionalReadXML(ele,eles,nameTxt); //找到符合条件的数据添加到eles的集合里 foreach (XElement item in eles) //遍历查到的数据,输出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey(); } /// <summary> /// 传统读取XML /// </summary> /// <param name="ele">查到哪个节点下的数据</param> /// <param name="eles">集合存放符合的数据</param> /// <param name="nameTxt">要查找的姓名</param> private static void TraditionalReadXML(XElement ele,List<XElement> eles,string nameTxt) { //首先遍历ele下的所有子节点,注意是子节点,不能查到下下层的节点 foreach (XElement item in ele.Elements()) { //判断这个元素的名字是不是name,如果是name,看内容是不是nameTxt if (item.Name.LocalName == "name") { if (item.Value == nameTxt) { //符合条件的节点,取其父级 eles.Add(item.Parent); } } //如果item里面还有子节点就递归 TraditionalReadXML(item, eles, nameTxt); } }
执行代码得到的结果为:
二、Linq写法读取XML
把上面的代码改成:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加载xml List<XElement> eles = new List<XElement>(); //获取符合条件的节点集合 string nameTxt = "王五"; //要查找的条件 //获得符合条件的节点 var query = from s in xdoc.Descendants() where s.Name.LocalName == "name" && s.Value ==nameTxt select s.Parent; foreach (XElement item in query) //把符合条件的节点添加到eles集合 { eles.Add(item); } foreach (XElement item in eles) //遍历查到的数据,输出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey();
}
加粗的地方为linq写法,它们的实现是一样的,这样会比普通的写法简单许多。
三、Linq查询lambda写法
把代码改成:
static void Main(string[] args) { XDocument xdoc = XDocument.Load("4.xml"); //加载xml List<XElement> eles = new List<XElement>(); //获取符合条件的节点集合 string nameTxt = "王五"; //要查找的条件 //遍历节点,把符合条件的添加到 eles集合 foreach (XElement i in xdoc.Descendants().Where(e=>{ if(e.Name.LocalName=="name") { if(e.Value==nameTxt) { return true ; } } return false; })) { eles.Add(i.Parent); } foreach (XElement item in eles) //遍历查到的数据,输出 { Console.WriteLine("Id:{0},name:{1},sex:{2},age:{3}", item.Attribute("id").Value,item.Element("name").Value,item.Element("sex").Value,item.Element("age").Value); } Console.ReadKey(); }
以上是三种读取XML的方法,可以根据自己喜欢的方法去用。