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#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构