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

  • 相关阅读:
    c++拷贝构造函数和赋值运算符
    c++运算符定义为成员函数还是非成员函数
    c++重载运算符位置的限制
    为什么operator<<运算符重载一定要为友元函数
    动态规划求一定数量骰子和的概率
    vector之reserve的坑
    c++ decltype和auto对比学习
    asio的前摄器模式
    动态显示当前时间
    js遍历二维数组
  • 原文地址:https://www.cnblogs.com/wei325/p/4897383.html
Copyright © 2020-2023  润新知