星星之火

燎原之势不可挡
随笔 - 128, 文章 - 3, 评论 - 377, 阅读 - 65万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

LINQ学习心得分享--------(四)LINQ TO XML实用解析

Posted on   星星之火116  阅读(2186)  评论(4编辑  收藏  举报

     在开始将之前,先请大家看一下本节的标题,没错!是"LINQ TO XML实用解析",所以在这一节里我会以实用为主,向大家一步一步讲解LINQ TO XML的知识。

     首先解释一下什么是LINQ to XML?LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。 LINQ to XML之前,我们主要通过XML DOM来创建XML文档对象。下面我给大家演示一下如何通过XML DOM创建文档对象。

示例:

private static void UserXMLDOMCreateXML()

        {

            XmlDocument xDocument = new XmlDocument();

            XmlElement xRoot = xDocument.CreateElement("Persons");

            XmlElement xPerson = xDocument.CreateElement("Person");

            XmlElement xPName = xDocument.CreateElement("Name");

            xPName.InnerText = "Olive"; 

            XmlElement xAge = xDocument.CreateElement("Age");

            xAge.InnerText = "22";

            XmlElement xPerson1 = xDocument.CreateElement("Person");

            XmlElement xPName1 = xDocument.CreateElement("Name");

            xPName1.InnerText = "Ares";

            XmlElement xAge1 = xDocument.CreateElement("Age");

            xAge1.InnerText = "23";

            XmlElement xPerson2 = xDocument.CreateElement("Person");

            XmlElement xPName2 = xDocument.CreateElement("Name");

            xPName2.InnerText = "Only";

            XmlElement xAge2 = xDocument.CreateElement("Age");

            xAge2.InnerText = "23";

            XmlElement xPerson3 = xDocument.CreateElement("Person");

            XmlElement xPName3 = xDocument.CreateElement("Name");

            xPName3.InnerText = "Love";

            XmlElement xAge3 = xDocument.CreateElement("Age");

            xAge3.InnerText = "23";

            xPerson.AppendChild(xPName);

            xPerson.AppendChild(xAge);

            xRoot.AppendChild(xPerson);

            xPerson1.AppendChild(xPName1);

            xPerson1.AppendChild(xAge1);

            xRoot.AppendChild(xPerson1);

            xPerson2.AppendChild(xPName2);

            xPerson2.AppendChild(xAge2);

            xRoot.AppendChild(xPerson2);

            xPerson3.AppendChild(xPName3);

            xPerson3.AppendChild(xAge3);

            xRoot.AppendChild(xPerson3);

            xDocument.AppendChild(xRoot);

            xDocument.Save(@"D:\LinqToXml.xml");

        }

结果如下:

下面再使用LINQ To XML的方式,创建一个XML文档对象。

示例:

 private static void UseLINQXMLCreateXML()

        {

            XElement xElement = new XElement("Persons",

                new XElement("Person",

                    new XElement("Name","Olive"),

                    new XElement("Age","22")),

                new XElement("Person",

                    new XElement("Name","Ares"),

                    new XElement("Age","23")),

                new XElement("Person",

                    new XElement("Name","Only"),

                    new XElement("Age","23")),

                new XElement("Person",

                    new XElement("Name","Love"),

                    new XElement("Age","22"))

            );

            xElement.Save(@"D:\LINQ To XML.xml");

        }

结果如下:

 

通过以上结果可以发现,我们通过Linq To XML的方式创建XML文档对象,比XML DOM方式要剩下很多的代码,使用起来也更方便、高效。

好了,通过这个例子我想你已经基本上学会了使用LINQ TO XML的方式创建XML文档,但是还有一些相关的东西,让我来为你细细道来。

我们看一般的XML文件里边都有注释,如果我们想要为我们所创建的文档添加注释该怎么办呢?

请看示例:

刚刚我们已经创建了XML文档对象,可是如果需求有变化需要向该对象添加新的子项这时该怎么办呢?

我们可以同过XElement.Add()的方法向XML文档对象添加新元素

请看示例:

   private static void AddNewXMLItem()

        {

           

            XElement xe = new XElement("Pseron",new XElement("Name", "Remote"),new XElement("Age", "23"));

            xElement.Add(xe);

            xElement.Save(@"D:\LINQ To XML.xml");

            Console.WriteLine("元素添加成功!");

        }

结果如下:

 

由此可知通过XElement.Add()方法,可以像XML文档对象添加新的元素,但是添加的元素,默认都添加在文档对象的末尾,如果想要添加到文档开头怎么办呢?

可以使用XElement.AddFirst()方法

示例:

XElement xe = new XElement("Pseron",new XElement("Name", "Snow"),new XElement("Age", "23"));

            xElement.AddFirst(xe);

            xElement.Save(@"D:\LINQ To XML.xml");

            Console.WriteLine("元素添加成功!");

结果:

 

除此之外还有AddAfterSelf()和AddBeforeSelf()方法,作用分别是:紧跟在此节点之后(之前)添加指定的内容。这里就不再做示例了。

说完了添加,如果要删除元素该怎么办呢?

通常我们会用XElement.Remove()方法或者XElement.RemoveAll()(为删除所有元素)

请看下面的示例:

//删除XML文档对象的第一元素

xElement.Elements("Person").First().Remove();

结果:

 

//删除XML文档对象中Name元素值为Ares<Person>节点

  xElement.Elements("Person").Elements("Name").Where(p => p.Value == "Ares").Remove();

结果:

 

和上边的结果图对比可知Name"Ares"的节点已经被删除了。

同样,如果我们想要查找某个节点也可这样做。请看上示例:

//查询XML文档对象中Name元素的值为“Love”的<Person>节点,并将其内容输出

示例: private static void SerachXMLItem()

        {

            Console.WriteLine("查询结果:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine(x.ToString());

        }

结果:

 

学会了查找,修改XML文档对象的指定内容就更加容易了。

////查询XML文档对象中Name元素的值为“Love”的<Person>节点,并将其内容做如下修改,<Name>Momo</Name>,<Age>22</Age>

示例:

 private static void SerachXMLItem()

        {

            Console.WriteLine("查询结果:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("修改前查询到的信息:");

            Console.WriteLine(x.Element("Name").ToString());

            Console.WriteLine(x.Element("Age").ToString());

            x.Element("Name").Value = "MoMo";

            x.Element("Age").Value = "22";

            Console.WriteLine("修改后的结果:");

            Console.WriteLine(x.ToString());

        }

结果:

 

原来Name值为LoveXML文档的最后,修改后Name值成为了"Momo"

至此,我想大家已经学会了Linq To XML的基本的增删改查新建等一些的操作,你有没有发现这里边用到了很多我们在开始这个系列课程学习时,学习的一些C#3.0的新特性呢,Lamdba在这里用的比较多,还有一些Linq的查询函数用到的之前讲的扩展方法,但是这些还远远的不够,在下面,我会仔细的把一些相关Linq To XML的东西再深入的讲解一下。

在实际的开发中可能需要为某些特定的元素添加一些额外的属性,通过下边的这个示例,我会向你展示,添加、修改、删除属性的方法。

示例:

//Name值为LovePerson添加地址属性,属性值为“北京”

    Console.WriteLine("为特定的元素添加地址属性:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

             x.SetAttributeValue("Address", "北京");

             Console.WriteLine(x.ToString());

结果:

 

示例:

//修改Name值为LovePerson的地址属性,修改属性值为“郑州”

示例:

 private static void ChangeAttribute()

        {

            Console.WriteLine("修改特定元素的地址属性:");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            x.SetAttributeValue("Address", "郑州");

            Console.WriteLine(x.ToString());

        }

结果:

 

如果想要删除属性的话,也很简单,只需要将要删除的属性值设为null就可以了

示例:

 private static void DeleteAttribute()

        {

            Console.WriteLine("删除特定属性");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            x.SetAttributeValue("Address", null);

        }

结果:

 

总而言之,与属性有关的操作都在XElement.SetAttributeValue()这个方法里。

在有些时候我们想要替换文档对象中的某些元素,请注意是“替换”而不是修改,那么你可以这样做:

示例: 使用ReplaceAll()替换元素

private static void ReplaceXElement()

        {

            Console.WriteLine("ReplaceAll()替换特定元素");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("替换前");

            Console.WriteLine(x.ToString());

            x.ReplaceAll("O(_)O哈哈~");

            Console.WriteLine("替换后");

            Console.WriteLine(x.ToString());

        }

结果:

 

示例:将特定的元素替换为一个新的元素 

private static void ReplaceXElement()

        {

            Console.WriteLine("ReplaceAll()替换特定元素");

            XElement x = xElement.Elements("Person").Where(p => p.Element("Name").Value == "Love").FirstOrDefault();

            Console.WriteLine("替换前");

            Console.WriteLine(x.ToString());

            x.ReplaceWith(new XElement("ZhiYe",

                                    new XElement("Name","Olive"),

                                    new XElement("Job","Sudent")));

        }

结果:

 

以上我们讲的这些都是在新建的文档对象里进行的操作,有时候我们可能会需要从已存在的文档中加载文档内容,一般可以通过XDocument类的静态的Load()方法,也可以通过使用XElement.Load()方法来完成这样的操作。XElementLoad方法是一种轻量级的方法,不需要新建文档对象,使用起来也比较方便,所以下面的示例就主要将一下使用XElement.Load()方法来加载已存在的文档。

private static void XElementLoad()

        {

            XElement root= XElement.Load(@"D:\LINQ To XML.xml");

            XElement x=  root.Elements("Person").Where(p => p.Element("Name").Value == "Olive").FirstOrDefault();

            Console.WriteLine(x.ToString());

        }

结果:

 

在实际的开发中我们可能会需要从现有的XML文档中读取信息,然后和返回相应的信息集合,在WindowsPhone 7的开发中,有时候我们就需要加载本地的XML数据,然后返回数据集合与ListBox进行绑定。

下边就做这样一个获取数据集合的小例子:

首先根据XML的结构特点创建一个相应的Person类:

public class Person

   {

       public string Name{get;set;}

       public string Age{get;set;}

   }

示例:返回数据集合

private static void JiHe()

        {

             //xml文档读取信息,并转换为相应的Person类集合

            List<Person> psersonList = XElement.Load(@"D:\LINQ To XML.xml").Elements("Person").Select(p => new Person

            {

                Name = p.Element("Name").Value,

                Age = p.Element("Age").Value

            }).ToList();

            Console.WriteLine("输出从XML文档中读取的集合对象!");

            foreach (Person p in psersonList)

            {

                Console.WriteLine("姓名:" + p.Name + "   年龄:" + p.Age);

            }

        }

结果:

 

好了,到这里已经把比较实用的Linq To Xml操作的所有方法都讲过了,希望可以对大家有所帮助,这里主要以实用为主,当然还有其他的一些方法和相关的操作类都没有讲到,如果有兴趣的朋友可以自己去关注一下。下一节,主要会将Linq To Sql的操作,这个也是比较常用和重要的。希望大家多多指导!

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示