C#基础巩固(3)-Linq To XML 读取XML

记录下一些读取XML的方法,以免到用的时候忘记了,还得花时间去找。

一、传统写法读取XML

      现在我有一个XML文件如下:

 C#基础巩固(3)-Linq To 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);
            }
        }

执行代码得到的结果为:

C#基础巩固(3)-Linq To XML 读取XML

二、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的方法,可以根据自己喜欢的方法去用。