LINQ to XML的增、删、改

来源:互联网 发布:爸爸妈妈的网络用语 编辑:程序博客网 时间:2024/05/22 13:30

前言

关于LINQ to XML的用法,已经有很多写得非常好的文章了,本文只是方便自己温习知识所用,所以写得潦草之处,请多包涵。
这次写有关于对XML操作的文章是因为最近几天,自己在学习WPF的同时,练练手,试着写一个桌面的课程表(大三狗也想不出来什么好玩的项目,所以瞎搞搞)。在过程中,遇到了需要存储本地数据的情况,所以选择了使用XML,所以自然就免不了要对XML进行增、删、改了。
使用C#对XML进行操作,有两种方式:XML DOMLINQ to XML。最开始我使用的是XML DOM的方式,后来发现使用起来,实在是有些冗杂与不便,突然想到C#里还有LINQ这个强大的技术。通过学习和使用LINQ to XML后,衡量两者的优缺点,认为各有各自的好处,在XML结构比较简单,且操作不复杂的情况下,XML DOM使用起来更加简单;而一旦XML结构复杂起来,LINQ to XML就拥有更简洁的代码和更高的可读性。推荐看看MSDN关于两者的比较,学习的时候也很推荐看看MSDN上关于这部分的内容。

XML示例结构

以下是本文中所操作的XML结构,一张课表信息片段。

<?xml version="1.0" encoding="utf-8"?><ClassTableInfo>  <Course CourseName="计算机基础">    <ClassRoom>2215</ClassRoom>    <TeacherName>NULL</TeacherName>    <CourseDayInWeeks>      <CourseDay Id="1">        <Day>Fri</Day>        <Num>5</Num>      </CourseDay>      <CourseDay Id="2">        <Day>Wed</Day>        <Num>1</Num>      </CourseDay>    </CourseDayInWeeks>    <CourseWeeks>      <BeginWeek>1</BeginWeek>      <EndWeek>18</EndWeek>      <Mod>Double</Mod>    </CourseWeeks>  </Course></ClassTableInfo>

【解释】

  • 上面的XML片段表示计算机基础课,包含的信息有:课程名、教室、教师名、上课日期(星期、节次),上课周期(开始周、结束周、上课模式)。

LINQ to XML的增

现在向XML文件中插入另外一节课的信息,代码如下

private void Add(){    //读取XML文件根节点    XElement root = XElement.Load(@"C:\Users\Rhine\Desktop\info.xml");    //创建新节点信息        XElement addEle = new XElement("ClassTableInfo",             new XElement("Course",                    new XAttribute("CourseName", "大学英语"),                new XElement("ClassRoom", "2217"),                new XElement("TeacherName", "NULL"),                new XElement("CourseDayInWeeks",                    new XElement("CourseDay",                            new XAttribute("Id","1"),                        new XElement("Day", "Fri"),                        new XElement("Num", "1")                                ),                    new XElement("CourseDay",                            new XAttribute("Id", "2"),                        new XElement("Day", "Wed"),                        new XElement("Num", "1")                                )                            ),                new XElement("CourseWeeks",                    new XElement("BeginWeek", "1"),                    new XElement("EndWeek", 18),                    new XElement("Mod", "Normal")                            )                        )                    );    //添加到目标根节点    root.Add(addEle.Elements());    //保存文件    root.Save(@"C:\Users\Rhine\Desktop\info.xml");}

【解释】

  • 代码结构非常清晰,在创建新节点的时候,一点要十分注意观察嵌套的结构,XElement代表元素,XAttribute代表属性,缩进尽量保持与XML文件格式相同,以增加可读性以及更方便维护。

LINQ to XML的删

从XML结构中删除课表信息,代码如下

private void Delete(){    XDocument doc = XDocument.Load(@"C:\Users\Rhine\Desktop\info.xml");    //筛选子节点    IEnumerable<XNode> list =        from el in doc.Descendants("Course")        where (string)el.Attribute("CourseName") == "大学英语"        select el;    //删除原节点与其所有的子节点    lst.Remove();    doc.Save(@"C:\Users\Rhine\Desktop\info.xml");}

【解释】

  • 这个就没什么好讲的了,重点在于筛选子节点了,这个查看MSDN帮助文档更详细,所以就不细说了,有需要自行查阅。

LINQ to XML的改

从XML结构中,对课表信息进行修改

private void Updata(){    //读入XML(根)    XElement root = XElement.Load(@"C:\Users\Rhine\Desktop\info.xml");    //查询课程名为计算机基础的XML信息    XElement courseRoot =        (from el in root.Descendants("Course")        where el.Attribute("CourseName").Value == "计算机基础"        select el).Single();    //修改教室、教师名  (第一层)    courseRoot.SetElementValue("ClassRoom", 4519);    courseRoot.SetElementValue("TeacherName", "Jack");    //获取CourseDayInWeeks子节点    XElement subCourseRoot = courseRoot.Element("CourseDayInWeeks");    //筛选CourseDayInWeeks节点的子节点(第二层)    XElement subSubCourseRoot =        (from el in subCourseRoot.Descendants("CourseDay")        where el.Attribute("Id").Value == "2"        select el).Single();    //修改CourseDay节点的子节点(第三层)    subSubCourseRoot.SetElementValue("Day", "Sat");    subSubCourseRoot.SetElementValue("Num", "6");    root.Save(@"C:\Users\Rhine\Desktop\info.xml");}

解释

  • 本小结中尤其需要注意的是节点的层次结构,我们经常需要有条件的修改子节点,所以需要利用LINQ to XML提供的查询功能,这使得我们操作更简便,能够组合复杂的查询条件。
  • 我相信能够查询并修改第三层子节点的方法,已经足够应对多数的修改情况。

小结

到这里LINQ to XML的大致用法已经介绍完了,基本够用了。LINQ的确是一项非常棒的技术,不得不说C#的确是门优秀的语言!

原创粉丝点击