首页 > 学院 > 开发设计 > 正文

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

2019-11-14 13:53:56
字体:
来源:转载
供稿:网友

记录下一些读取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的方法,可以根据自己喜欢的方法去用。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表