1、LINQ to XML类

以下的代码演示了如何使用LINQ to XML来快速创建一个xml:

隐藏行号 复制代码 ?创建 XML
  1. public static void CreateDocument()
    
  2. {
    
  3.     string path = @"d:\website";
    
  4.     XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
    
  5.                                    new XElement("Root", "root"));
    
  6.     xdoc.Save(path);
    
  7. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>root</Root>

2、XElement类

XElement 类是 LINQ to XML 中的基础类之一。 它表示一个 XML 元素。 可以使用该类创建元素;更改元素内容;添加、更改或删除子元素;向元素中添加属性;或以文本格式序列化元素内容。 还可以与 System.Xml 中的其他类(例如 XmlReader、XmlWriter 和 XslCompiledTransform)进行互操作。

使用LINQ to XML创建xml文档有很多种方式,具体使用哪种方法要根据实际需要。而创建xml文档最简单、最常见的方式是使用XElement类。以下的代码演示了如何使用XElement类创建一个xml文档:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void CreateCategories()
    
  2. {
    
  3.     string path = @"d:\website";
    
  4.     XElement root = new XElement("Categories",
    
  5.         new XElement("Category",
    
  6.             new XElement("CategoryID", Guid.NewGuid()),
    
  7.             new XElement("CategoryName", "Beverages")
    
  8.             ),
    
  9.         new XElement("Category",
    
  10.             new XElement("CategoryID", Guid.NewGuid()),
    
  11.             new XElement("CategoryName", "Condiments")
    
  12.             ),
    
  13.         new XElement("Category",
    
  14.             new XElement("CategoryID", Guid.NewGuid()),
    
  15.             new XElement("CategoryName", "Confections")
    
  16.             )
    
  17.        );
    
  18.     root.Save(path);
    
  19. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<Categories>
  <Category>
    <CategoryID>57485174-46fc-4e8c-8d98-d25b53d504a1</CategoryID>
    <CategoryName>Beverages</CategoryName>
  </Category>
  <Category>
    <CategoryID>1474dde1-8014-48f7-b093-b47ca5d5b770</CategoryID>
    <CategoryName>Condiments</CategoryName>
  </Category>
  <Category>
    <CategoryID>364224e0-e002-4939-90fc-0fd93e0cf35b</CategoryID>
    <CategoryName>Confections</CategoryName>
  </Category>
</Categories>

XElement类包含了许多方法,这些方法使得处理xml变得轻而易举。有关这些方法请参照MSDN。

其中,Save、CreateReader、ToString和WriteTo方法是比较常用的三个方法:

3、XAttribute类

XAttribute类用来处理元素的属性,属性是与元素相关联的“名称-值”对,每个元素中不能有名称重复的属性。使用XAttribute类与使用XElement类的操作十分相似,下面的示例演示了如何在创建xml树时为其添加一个属性:

显示行号 复制代码 ?这是一段程序代码。
  1. public static XElement CreateCategoriesByXAttribute()
    
  2. {
    
  3.     XElement root = new XElement("Categories",
    
  4.         new XElement("Category",
    
  5.             new XAttribute("CategoryID", Guid.NewGuid()),
    
  6.             new XElement("CategoryName", "Beverages")
    
  7.             ),
    
  8.         new XElement("Category",
    
  9.             new XAttribute("CategoryID", Guid.NewGuid()),
    
  10.             new XElement("CategoryName", "Condiments")
    
  11.             ),
    
  12.         new XElement("Category",
    
  13.             new XAttribute("CategoryID", Guid.NewGuid()),
    
  14.             new XElement("CategoryName", "Confections")
    
  15.             )
    
  16.        );
    
  17.     root.Save(path);
    
  18.     return root;
    
  19. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<Categories>
  <Category CategoryID="a6d5ef04-3f83-4e00-aeaf-52444add7570">
    <CategoryName>Beverages</CategoryName>
  </Category>
  <Category CategoryID="67a168d5-6b22-4d82-9bd4-67bec88c2ccb">
    <CategoryName>Condiments</CategoryName>
  </Category>
  <Category CategoryID="17398f4e-5ef1-48da-8a72-1c54371b8e76">
    <CategoryName>Confections</CategoryName>
  </Category>
</Categories>

XAttribute类的方法比较少,常用的三个是:

以下的示例使用Remove来删除第一个元素的CategoryID属性:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void RemoveAttribute()
    
  2. {
    
  3.     XElement xdoc = CreateCategoriesByXAttribute();
    
  4.     XAttribute xattr = xdoc.Element("Category").Attribute("CategoryID");
    
  5.     xattr.Remove();
    
  6.     xdoc.Save(path);
    
  7. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<Categories>
  <Category>
    <CategoryName>Beverages</CategoryName>
  </Category>
  <Category CategoryID="5c311c1e-ede5-41e5-93f7-5d8b1d7a0346">
    <CategoryName>Condiments</CategoryName>
  </Category>
  <Category CategoryID="bfde8db5-df84-4415-b297-cd04d8db9712">
    <CategoryName>Confections</CategoryName>
  </Category>
</Categories>

作为尝试,试一试以下删除属性的方法:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void RemoveAttributeByDoc()
    
  2. {
    
  3.     XElement xdoc = CreateCategoriesByXAttribute();
    
  4.     XAttribute xattr = xdoc.Attribute("CategoryID");
    
  5.     xattr.Remove();
    
  6.     xdoc.Save(path);
    
  7. }
    

运行该示例将会抛出一个空引用异常,因为元素Categories没有一个叫做CategoryID的属性。

4、XDocument类

XDocument类提供了处理xml文档的方法,包括声明、注释和处理指令。一个XDocument对象可以包含以下内容:

下面的示例创建了一个简单的xml文档,它包含几个元素和一个属性,以及一个处理指令和一些注释:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void CreateXDocument()
    
  2.       {
    
  3.           XDocument xdoc = new XDocument(
    
  4.                   new XProcessingInstruction("xml-stylesheet", "title='EmpInfo'"),
    
  5.                   new XComment("some comments"),
    
  6.                   new XElement("Root",
    
  7.                           new XElement("Employees",
    
  8.                                   new XElement("Employee",
    
  9.                                           new XAttribute("id", "1"),
    
  10.                                           new XElement("Name", "Scott Klein"),
    
  11.                                           new XElement("Title", "Geek"),
    
  12.                                           new XElement("HireDate", "02/05/2007"),
    
  13.                                           new XElement("Gender", "M")
    
  14.                                       )
    
  15.                               )
    
  16.                       ),
    
  17.                   new XComment("more comments")
    
  18.               );
    
  19.           xdoc.Save(path);
    
  20.       }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet title='EmpInfo'?>
<!--some comments-->
<Root>
  <Employees>
    <Employee id="1">
      <Name>Scott Klein</Name>
      <Title>Geek</Title>
      <HireDate>02/05/2007</HireDate>
      <Gender>M</Gender>
    </Employee>
  </Employees>
</Root>
<!--more comments-->

XDocument类包含多个与XElement类相同的方法,具体内容可以参阅MSDN。需要注意的是,处理节点和元素的大部分功能都可以通过XElement获得,只有当绝对需要文档层次的处理能力,以及需要访问注释、处理指令和声明时,才有使用XDocument类的必要。

创建了xml文档后,可以使用NodesAfterSelf方法返回指定的XElement元素之后的所有同级元素。需要注意的是,此方法只包括返回集合中的同级元素,而不包括子代。此方法使用延迟执行。以下代码演示了这一过程:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void NodesAfterSelf()
    
  2. {
    
  3.     XElement root = new XElement("Categories",
    
  4.         new XElement("Category",
    
  5.                 new XElement("CategoryID", Guid.NewGuid()),
    
  6.                 new XElement("CategoryName", "食品"),
    
  7.                 new XElement("Description", "可以吃的东西")
    
  8.             )
    
  9.         );
    
  10.     foreach (var item in root.Element("Category").Element("CategoryID").NodesAfterSelf())
    
  11.     {
    
  12.         Console.WriteLine((item as XElement).Value);
    
  13.     }
    
  14. }
    

二、LINQ to XML编程概念

本节将介绍LINQ to XML编程的相关概念,例如如何加载xml、创建全新xml、操纵xml的信息以及遍历xml文档。

1、加载已有的xml

使用LINQ to XML加载xml可以从多种数据源获得,例如字符串、XmlReader、TextReader或文件。

下面的示例演示了如何从文件中加载xml:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void LoadFromFile()
    
  2. {
    
  3.     XElement root = XElement.Load(path);
    
  4.     Console.WriteLine(root.ToString());
    
  5. }
    

也可以使用Parse方法从一个字符串加载xml:

显示行号 复制代码 ?这是一段程序代码。
  1.     public static void LoadFromString()
    
  2.     {
    
  3.         XElement root = XElement.Parse(@"
    
  4.     <Categories>
    
  5.       <Category>
    
  6.         <CategoryID>1</CategoryID>
    
  7.         <CategoryName>Beverages</CategoryName>
    
  8.         <Description>Soft drinks, coffees, teas, beers, and ales</Description>
    
  9.       </Category>
    
  10.     </Categories>
    
  11. ");
    
  12.         Console.WriteLine(root.ToString());
    
  13.     }
    

2、保存xml

在前面的示例中曾多次调用XElement对象的Save方法来保存xml文档,在这里就不冗述了。

3、创建xml

在前面的示例中曾多次调用XElement对象的构造函数来创建xml文档,在这里就不冗述了。需要说明的是,在使用LINQ to XML创建xml文档时,会有代码缩进,这使代码的可读性大大加强。

4、遍历xml

使用LINQ to XML在xml树中遍历xml是相当简单的。只需要使用XElement和XAttribute类中所提供的方法。Elements和Element方法提供了定位到某个或某些元素的方式。下面的示例演示了如何遍历xml树,并获取指定元素的方式:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void Enum()
    
  2. {
    
  3.     XElement root = new XElement("Categories");
    
  4.     using (NorthwindDataContext db = new NorthwindDataContext())
    
  5.     {
    
  6.         root.Add(
    
  7.                 db.Categories
    
  8.                 .Select
    
  9.                 (
    
  10.                     c => new XElement
    
  11.                     (
    
  12.                         "Category"
    
  13.                         , new XElement("CategoryName", c.CategoryName)
    
  14.                     )
    
  15.                 )
    
  16.             );
    
  17.     }
    
  18.     foreach (var item in root.Elements("Category"))
    
  19.     {
    
  20.         Console.WriteLine(item.Element("CategoryName").Value);
    
  21.     }
    
  22. }
    

上述代码运行的结果为:

是不是很简单呢?Nodes()、Elements()、Element(name)和Elements(name)方法为xml树的导航提供了基本功能。

5、操纵xml

LINQ to XML一个重要的特性是能够方便地修改xml树,如添加、删除、更新和复制xml文档的内容。

I.插入

使用XNode类的插入方法可以方便地向xml树添加内容:

在下面的示例中,使用AddAfterSelf方法向现有xml中添加一个新节点:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void AddAfterSelf()
    
  2. {
    
  3.     XElement root = XElement.Parse(@"
    
  4.         <Categories>
    
  5.           <Category>
    
  6.             <CategoryID>1</CategoryID>
    
  7.             <CategoryName>Beverages</CategoryName>
    
  8.             <Description>Soft drinks, coffees, teas, beers, and ales</Description>
    
  9.           </Category>
    
  10.         </Categories>
    
  11.     ");
    
  12.     XElement xele = root.Element("Category").Element("CategoryName");
    
  13.     xele.AddAfterSelf(new XElement("AddDate", DateTime.Now));
    
  14.     root.Save(path);
    
  15. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>

<Categories>

  <Category>

    <CategoryID>1</CategoryID>

    <CategoryName>Beverages</CategoryName>

    <AddDate>2010-01-31T03:08:51.813736+08:00</AddDate>

    <Description>Soft drinks, coffees, teas, beers, and ales</Description>

  </Category>

</Categories>



当需要添加一个元素到指定节点之前时,可以使用AddBeforeSelf方法。

II.更新

在LINQ to XML中更新xml内容可以使用以下几种方法:

在下面的示例中使用了ReplaceWith与SetElementValue方法对xml进行了更新操作:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void Update()
    
  2. {
    
  3.     XElement root = XElement.Parse(@"
    
  4.                                    <Categories>
    
  5.                                       <Category>
    
  6.                                         <CategoryID>1</CategoryID>
    
  7.                                         <CategoryName>Beverages</CategoryName>
    
  8.                                         <Description>Soft drinks, coffees, teas, beers, and ales</Description>
    
  9.                                       </Category>
    
  10.                                     </Categories>
    
  11.                                   ");
    
  12.     root.Element("Category").Element("CategoryID").ReplaceWith(new XElement("ID", "2"));
    
  13.     root.Element("Category").SetElementValue("CategoryName", "test data");
    
  14.     root.Save(path);
    
  15. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>

<Categories>

  <Category>

    <ID>2</ID>

    <CategoryName>test data</CategoryName>

    <Description>Soft drinks, coffees, teas, beers, and ales</Description>

  </Category>

</Categories>

III.删除

可以使用Remove(XElement)与RemoveAll方法来删除xml。

在下面的示例中,使用了RemoveAll方法:

显示行号 复制代码 ?这是一段程序代码。
  1. }
    
  2.   public static void Remove()
    
  3.   {
    
  4.       string path = @"d:\";
    
  5.       XElement root = XElement.Parse(@"
    
  6.                                   <Categories>
    
  7.                                     <Category>
    
  8.                                       <CategoryID>1</CategoryID>
    
  9.                                       <CategoryName>Beverages</CategoryName>
    
  10.                                       <Description>Soft drinks, coffees, teas, beers, and ales</Description>
    
  11.                                     </Category>
    
  12.                                   </Categories>
    
  13.                                 ");
    
  14.       root.RemoveAll();
    
  15.       root.Save(path);
    
  16.   }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>

<Categories />

在下面的示例中,使用了Remove方法删除了xml的Description元素:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void Remove()
    
  2. {
    
  3.     XElement root = XElement.Parse(@"
    
  4.                                 <Categories>
    
  5.                                   <Category>
    
  6.                                     <CategoryID>1</CategoryID>
    
  7.                                     <CategoryName>Beverages</CategoryName>
    
  8.                                     <Description>Soft drinks, coffees, teas, beers, and ales</Description>
    
  9.                                   </Category>
    
  10.                                 </Categories>
    
  11.                                 ");
    
  12.     root.Element("Category").Element("Description").Remove();
    
  13.     root.Save(path);
    
  14. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>

<Categories>

  <Category>

    <CategoryID>1</CategoryID>

    <CategoryName>Beverages</CategoryName>

  </Category>

</Categories>

6、处理属性

I.添加

LINQ to XML添加属性与添加元素师类似的,可以使用构造函数或者Add方法来添加属性:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void AddAttribute()
    
  2. {
    
  3.     XElement root = new XElement("Categories",
    
  4.         new XElement("Category",
    
  5.             new XAttribute("CategoryID", "1"),
    
  6.             new XElement("CategoryName", "Beverages"),
    
  7.             new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")
    
  8.         )
    
  9.     );
    
  10.     root.Element("Category").Add(new XAttribute("AddDate", DateTime.Now.ToShortDateString()));
    
  11.     root.Save(path);
    
  12. }
    

运行该示例将会得到一个xml文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>

<Categories>

  <Category CategoryID="1" AddDate="2010-01-31">

    <CategoryName>Beverages</CategoryName>

    <Description>Soft drinks, coffees, teas, beers, and ales</Description>

  </Category>

</Categories>

II.检索

检索属性可以使用Attribute(name)方法:

显示行号 复制代码 ?这是一段程序代码。
  1. public static void SelectAttribute()
    
  2. {
    
  3.     XElement root = new XElement("Categories",
    
  4.         new XElement("Category",
    
  5.             new XAttribute("CategoryID", "1"),
    
  6.             new XElement("CategoryName", "Beverages"),
    
  7.             new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")
    
  8.         )
    
  9.     );
    
  10.     XAttribute xattr = root.Element("Category").Attribute("CategoryID");
    
  11.     Console.WriteLine(xattr.Name);
    
  12.     Console.WriteLine(xattr.Value);
    
  13. }
    

上述代码的运行结果为:

CategoryID

1

本文总结

本文介绍了LINQ to XML的编程基础,即System.Xml.Linq命名空间中的多个LINQ to XML类,这些类都是LINQ to XML的支持类,它们使得处理xml比使用其他的xml工具容易得多。在本文中,着重介绍的是XElement、XAttribute和XDocument。

LINQ to XML 编程基础的更多相关文章

  1. LINQ to XML编程之编程基础

    1.声明,LINQ to XML让xml的创建变得非常简单. XDocument myDocument = new XDocument( new XDeclaration("1.0" ...

  2. [开发笔记]-Linq to xml学习笔记

    最近需要用到操作xml文档的方法,学习了一下linq to xml,特此记录. 测试代码: class Program { //参考: LINQ to XML 编程基础 - luckdv - 博客园 ...

  3. Linq世界走一走(LINQ TO XML)

    前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.L ...

  4. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  5. Linq之Linq to XML

    目录 写在前面 系列文章 linq to xml 总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将wor ...

  6. [C#]Linq To Xml 介绍- 转

    LINQ to XML 类概述 LINQ to XML 旨在使 XML 名称尽可能简单.     XAttribute 类 XAttribute 表示一个 XML 属性. XCData 类 XCDat ...

  7. [引]LINQ to XML 类概述

    本文转自:http://msdn.microsoft.com/zh-cn/library/bb387023.aspx 本主题提供 System.Xml.Linq 命名空间中 LINQ to XML 类 ...

  8. [.net 面向对象编程基础] (20) LINQ使用

    [.net 面向对象编程基础] (20)  LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...

  9. [.net 面向对象编程基础] (19) LINQ基础

    [.net 面向对象编程基础] (19)  LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...

随机推荐

  1. Druid 基础使用-操作篇(Imply )

    一.Imply Druid 原生的配置较麻烦,在上一篇单机版安装中有所涉及   Imply 基于Druid 进行了一些组件的开发,提供开源社区版本和商业版,简化了部署,开发了一些应用.https:// ...

  2. Windows动态库学习心得

    最近在工作中需要给项目组其他成员提供调用函数,决心抛弃以前“拷贝头文件/源文件”的简陋方法,采用动态库的方式对自己开发的接口进行模块化管理.因之前一直没有机会从事Windows动态库的开发,现借助这个 ...

  3. sqlserver表分区

    参考:http://www.cnblogs.com/knowledgesea/p/3696912.html 及百度搜索sqlserver表分区 create partition function sg ...

  4. okhttp3 post 数据打包方法

    import okhttp3.OkHttpClient; import okhttp3.FormBody; import okhttp3.Request; import okhttp3.Request ...

  5. CodeSmith7代码生成器针对PostgreSQL数据库无法使用的Bug修复全过程

    前言 最近公司需要将原来使用的MSSQL数据库整体迁移至pgsql,需要使用CodeSmith生成IBatisNet的配置文件.按照提示安装了Npgsql.dll后依然无法使用.引发了本次通过反编译修 ...

  6. 二叉树遍历(Binary Tree Traversal)

    二叉树的递归遍历比较简单,这里说一下非递归遍历,以中序遍历为例子. 非递归遍历主要用到栈来协助进行.对于一个二叉树,首先根节点入栈,如果有左儿子,则继续入栈,重复直到最左边的儿子,这时候此节点值为要遍 ...

  7. C# 软件绑定QQ群类开源放出

    周天闲来无事写个公共类,可以添加到你们自己项目中限制必须加入你QQ群才可以使用. 代码简单,高手勿喷,有哪里不合理的请回帖让大家学习学习. using System; using System.Tex ...

  8. dijit.form.Select 基本用法

    dijit.form.Select 1)创建: var division = new dijit.form.Select({ id: "Division",//id必须唯一 nam ...

  9. VMware中装Win2012并配置Hyper-v

    VMware中装配Win2012再配置Hyper-v,解决虚拟机监控程序已经在运行中的方法 找到虚拟机存放的位置,用记事本打开Windows Server 2012.vmx,在最后添加两行并保存: h ...

  10. Web前端入门必学知识

    入门主要有三个部分   一.html+css部分:      1.前端的入门门槛极低,体现在HTML和CSS上运行环境就是浏览器,html+css这部分特别简单,网上搜资料,书籍视频非常多.css中盒 ...