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

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

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

示例:

privatestaticvoidUserXMLDOMCreateXML()

{

XmlDocumentxDocument=newXmlDocument();

XmlElementxRoot=xDocument.CreateElement("Persons");

XmlElementxPerson=xDocument.CreateElement("Person");

XmlElementxPName=xDocument.CreateElement("Name");

xPName.InnerText="Olive";

XmlElementxAge=xDocument.CreateElement("Age");

xAge.InnerText="22";

XmlElementxPerson1=xDocument.CreateElement("Person");

XmlElementxPName1=xDocument.CreateElement("Name");

xPName1.InnerText="Ares";

XmlElementxAge1=xDocument.CreateElement("Age");

xAge1.InnerText="23";

XmlElementxPerson2=xDocument.CreateElement("Person");

XmlElementxPName2=xDocument.CreateElement("Name");

xPName2.InnerText="Only";

XmlElementxAge2=xDocument.CreateElement("Age");

xAge2.InnerText="23";

XmlElementxPerson3=xDocument.CreateElement("Person");

XmlElementxPName3=xDocument.CreateElement("Name");

xPName3.InnerText="Love";

XmlElementxAge3=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学习心得分享--------(四)LINQ TO XML实用解析

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

示例:

privatestaticvoidUseLINQXMLCreateXML()

{

XElementxElement=newXElement("Persons",

newXElement("Person",

newXElement("Name","Olive"),

newXElement("Age","22")),

newXElement("Person",

newXElement("Name","Ares"),

newXElement("Age","23")),

newXElement("Person",

newXElement("Name","Only"),

newXElement("Age","23")),

newXElement("Person",

newXElement("Name","Love"),

newXElement("Age","22"))

);

xElement.Save(@"D:\LINQToXML.xml");

}

结果如下:

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

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

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

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

请看示例:

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

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

请看示例:

privatestaticvoidAddNewXMLItem()

{

XElementxe=newXElement("Pseron",newXElement("Name","Remote"),newXElement("Age","23"));

xElement.Add(xe);

xElement.Save(@"D:\LINQToXML.xml");

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

}

结果如下:

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

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

可以使用XElement.AddFirst()方法

示例:

XElementxe=newXElement("Pseron",newXElement("Name","Snow"),newXElement("Age","23"));

xElement.AddFirst(xe);

xElement.Save(@"D:\LINQToXML.xml");

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

结果:

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

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

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

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

请看下面的示例:

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

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

结果:

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

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

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

结果:

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

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

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

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

示例:privatestaticvoidSerachXMLItem()

{

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

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

Console.WriteLine(x.ToString());

}

结果:

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

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

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

示例:

privatestaticvoidSerachXMLItem()

{

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

XElementx=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());

}

结果:

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

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

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

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

示例:

//为Name值为Love的Person添加地址属性,属性值为“北京”

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

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

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

Console.WriteLine(x.ToString());

结果:

示例:

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

示例:

privatestaticvoidChangeAttribute()

{

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

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

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

Console.WriteLine(x.ToString());

}

结果:

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

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

示例:

privatestaticvoidDeleteAttribute()

{

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

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

x.SetAttributeValue("Address",null);

}

结果:

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

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

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

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

privatestaticvoidReplaceXElement()

{

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

XElementx=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());

}

结果:

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

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

privatestaticvoidReplaceXElement()

{

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

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

Console.WriteLine("替换前");

Console.WriteLine(x.ToString());

x.ReplaceWith(newXElement("ZhiYe",

newXElement("Name","Olive"),

newXElement("Job","Sudent")));

}

结果:

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

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

privatestaticvoidXElementLoad()

{

XElementroot=XElement.Load(@"D:\LINQToXML.xml");

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

Console.WriteLine(x.ToString());

}

结果:

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

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

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

publicclassPerson

{

publicstringName{get;set;}

publicstringAge{get;set;}

}

示例:返回数据集合

privatestaticvoidJiHe()

{

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

List<Person>psersonList=XElement.Load(@"D:\LINQToXML.xml").Elements("Person").Select(p=>newPerson

{

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

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

}).ToList();

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

foreach(PersonpinpsersonList)

{

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

}

}

结果:

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

你可能感兴趣的:(LINQ)