LINQ to XML LINQ学习第一篇

1、LINQ to XML类

 

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

public static void CreateDocument()
{
    string path = @"d:\website";
    XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"),
                                   new XElement("Root", "root"));
    xdoc.Save(path);
}

 

运行该示例将会得到一个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文档:

 

public static void CreateCategories()
{
    string path = @"d:\website";
    XElement root = new XElement("Categories",
        new XElement("Category",
            new XElement("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Beverages")
            ),
        new XElement("Category",
            new XElement("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Condiments")
            ),
        new XElement("Category",
            new XElement("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Confections")
            )
       );
    root.Save(path);
}

 

运行该示例将会得到一个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树时为其添加一个属性:

public static XElement CreateCategoriesByXAttribute()
{
    XElement root = new XElement("Categories",
        new XElement("Category",
            new XAttribute("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Beverages")
            ),
        new XElement("Category",
            new XAttribute("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Condiments")
            ),
        new XElement("Category",
            new XAttribute("CategoryID", Guid.NewGuid()),
            new XElement("CategoryName", "Confections")
            )
       );
    root.Save(path);
    return root;
}

运行该示例将会得到一个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属性:

public static void RemoveAttribute()
{
    XElement xdoc = CreateCategoriesByXAttribute();
    XAttribute xattr = xdoc.Element("Category").Attribute("CategoryID");
    xattr.Remove();
    xdoc.Save(path);
}

 

运行该示例将会得到一个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>

 

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

public static void RemoveAttributeByDoc()
{
    XElement xdoc = CreateCategoriesByXAttribute();
    XAttribute xattr = xdoc.Attribute("CategoryID");
    xattr.Remove();
    xdoc.Save(path);
}

 

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

 

4、XDocument类

 

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

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

public static void CreateXDocument()
      {
          XDocument xdoc = new XDocument(
                  new XProcessingInstruction("xml-stylesheet", "title='EmpInfo'"),
                  new XComment("some comments"),
                  new XElement("Root",
                          new XElement("Employees",
                                  new XElement("Employee",
                                          new XAttribute("id", "1"),
                                          new XElement("Name", "Scott Klein"),
                                          new XElement("Title", "Geek"),
                                          new XElement("HireDate", "02/05/2007"),
                                          new XElement("Gender", "M")
                                      )
                              )
                      ),
                  new XComment("more comments")
              );
          xdoc.Save(path);
      

 

运行该示例将会得到一个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元素之后的所有同级元素。需要注意的是,此方法只包括返回集合中的同级元素,而不包括子代。此方法使用延迟执行。以下代码演示了这一过程:

public static void NodesAfterSelf()
{
    XElement root = new XElement("Categories",
        new XElement("Category",
                new XElement("CategoryID", Guid.NewGuid()),
                new XElement("CategoryName", "食品"),
                new XElement("Description", "可以吃的东西")
            )
        );
    foreach (var item in root.Element("Category").Element("CategoryID").NodesAfterSelf())
    {
        Console.WriteLine((item as XElement).Value);
    }
}

 

二、LINQ to XML编程概念

 

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

 

1、加载已有的xml

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

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

public static void LoadFromFile()
{
    XElement root = XElement.Load(path);
    Console.WriteLine(root.ToString());
}

 

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

    public static void LoadFromString()
    {
        XElement root = XElement.Parse(@"
    <Categories>
      <Category>
        <CategoryID>1</CategoryID>
        <CategoryName>Beverages</CategoryName>
        <Description>Soft drinks, coffees, teas, beers, and ales</Description>
      </Category>
    </Categories>
");
        Console.WriteLine(root.ToString());
    }

 

 

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树,并获取指定元素的方式:

public static void Enum()
{
    XElement root = new XElement("Categories");
    using (NorthwindDataContext db = new NorthwindDataContext())
    {
        root.Add(
                db.Categories
                .Select
                (
                    c => new XElement
(
                        "Category"
, new XElement("CategoryName", c.CategoryName)
                    )
                )
            );
    }
    foreach (var item in root.Elements("Category"))
    {
        Console.WriteLine(item.Element("CategoryName").Value);
    }
}

 

上述代码运行的结果为:

 

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

 

5、操纵xml

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

I.插入

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

 

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

public static void AddAfterSelf()
{
    XElement root = XElement.Parse(@"
        <Categories>
          <Category>
            <CategoryID>1</CategoryID>
            <CategoryName>Beverages</CategoryName>
            <Description>Soft drinks, coffees, teas, beers, and ales</Description>
          </Category>
        </Categories>
    ");
    XElement xele = root.Element("Category").Element("CategoryName");
    xele.AddAfterSelf(new XElement("AddDate", DateTime.Now));
    root.Save(path);
}

 

运行该示例将会得到一个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进行了更新操作:

public static void Update()
{
    XElement root = XElement.Parse(@"
                                   <Categories>
                                      <Category>
                                        <CategoryID>1</CategoryID>
                                        <CategoryName>Beverages</CategoryName>
                                        <Description>Soft drinks, coffees, teas, beers, and ales</Description>
                                      </Category>
                                    </Categories>
                                  ");
    root.Element("Category").Element("CategoryID").ReplaceWith(new XElement("ID", "2"));
    root.Element("Category").SetElementValue("CategoryName", "test data");
    root.Save(path);
}

 

运行该示例将会得到一个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方法:

public static void Remove()
  {
      string path = @"d:\";
      XElement root = XElement.Parse(@"
                                  <Categories>
                                    <Category>
                                      <CategoryID>1</CategoryID>
                                      <CategoryName>Beverages</CategoryName>
                                      <Description>Soft drinks, coffees, teas, beers, and ales</Description>
                                    </Category>
                                  </Categories>
                                ");
      root.RemoveAll();
      root.Save(path);
  }

 

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

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

 

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

public static void Remove()
{
    XElement root = XElement.Parse(@"
                                <Categories>
                                  <Category>
                                    <CategoryID>1</CategoryID>
                                    <CategoryName>Beverages</CategoryName>
                                    <Description>Soft drinks, coffees, teas, beers, and ales</Description>
                                  </Category>
                                </Categories>
                                ");
    root.Element("Category").Element("Description").Remove();
    root.Save(path);
}

 

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

<?xml version="1.0" encoding="utf-8"?>
<Categories>
  <Category>
    <CategoryID>1</CategoryID>
    <CategoryName>Beverages</CategoryName>
  </Category>
</Categories>

6、处理属性

I.添加

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

public static void AddAttribute()
{
    XElement root = new XElement("Categories",
        new XElement("Category",
            new XAttribute("CategoryID", "1"),
            new XElement("CategoryName", "Beverages"),
            new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")
        )
    );
    root.Element("Category").Add(new XAttribute("AddDate", DateTime.Now.ToShortDateString()));
    root.Save(path);
}

 

运行该示例将会得到一个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)方法:

public static void SelectAttribute()
{
    XElement root = new XElement("Categories",
        new XElement("Category",
            new XAttribute("CategoryID", "1"),
            new XElement("CategoryName", "Beverages"),
            new XElement("Description", "Soft drinks, coffees, teas, beers, and ales")
        )
    );
    XAttribute xattr = root.Element("Category").Attribute("CategoryID");
    Console.WriteLine(xattr.Name);
    Console.WriteLine(xattr.Value);
}

 

上述代码的运行结果为:

CategoryID

1

 

本文总结

 

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

时间: 2024-10-29 08:09:31

LINQ to XML LINQ学习第一篇的相关文章

Linq专题之提高编码效率—— 第一篇 Aggregate方法

我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的,废话不多说,先从Aggregate这个貂毛说起. 一:应用场景 前不久在写一个项目的时候,我需要捞取营销活动,刚好营销活动有两个类型,一种是普通活动,一个是触发式活动,由于存放在两张表中,并且捞取 之后需要做一些实体的转存,等等计算,所以就有了类似这样的代码. namespace ConsoleA

React.js入门学习第一篇_javascript技巧

一.JSX介绍 ①定义 JSX=JavaScript XML,是一种在React组件内部构建标签的类XML语法.React在不使用JSX的情况下一样可以工作,但是使用JSX可以提高组件的可读性,增强JS语义,结构清晰,抽象程度高,代码模块化.因此推荐在React中使用JSX. ②特点 1.元素名首字母大写 2.符合嵌套规则 3.可以写入求值表达式 4.驼峰式命名 5.不能使用javascript原生函数的一些关键词,如for和class.需要替换成htmlFor和className ③使用方法

angular源码学习第一篇 setupModuleLoader方法_AngularJS

angular源码其实结构非常清晰,划分的有条有理的,大概就是这样子: (function(window,document,jquery,undefined){ //一些工具函数 //EXPR 编译器 自执行 //setupModuleLoader方法,公司内部的框架是vxsetup方法,(只是定义,没有调用) //moduler方法() //angular初始化方法,公司内部的框架是vxinit方法 //bootstrap //createInjector //一系列指令,服务,过滤器等指令

Linq To XML学习

这几天抽空看了看C# 3.0的一些新特性,匿名对象.Lambda表达式.Linq等 ,给我很大的冲击.简洁化.人性化.更加可读易理解的代码,让C# 3.0增色不 少.以前我总认为C#语言就是follow Java语言,现在看来微软就是强大,在流 行的基础上创出了自己的个性,漂亮简洁高效的编程语言让人不得不倾心. 因为以前的项目用到Xml操作比较多,我着重看了看Linq To Xml,用 msdn上的话来说,Linq To Xml是LINQ项目的一个组件,它是一种现代化的.在 内存中的XML编程A

Linq To Xml学习 - 3.查询、更新、删除

Linq To Xml学习 - 3.查询.更新.删除 文章最后有该示例的XML文档. 查找具有特定属性的元素 XElement root = XElement.Load ("PurchaseOrder.xml"); IEnumerable address = from el in root.Elements("Address") where (string)el.Attribute("Type") == "Billing" s

asp.net Linq to Xml学习笔记_实用技巧

加上之前学习过Linq to Entity,因此学习起来也比较随心应手. 以下是项目中某个底层的代码,记下做个备忘,如果能给新手学习Linq to Xml带来帮助,那就再好不过了 XML文件的格式: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <configuration> <OPsystemConfig> <MemberCenter> <DomainNam

Linq学习教程 Linq to Xml读取复杂xml及Linq to js使用

Linq to Xml读取复杂xml(带命名空间) xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C#项目调用不知道是什么语言写的一个WebService,然后添加服务引用总是失败,通过代理的方式动态调用也总是报错,最后没办法,通过发送原始的WebRequest请求直接得到对方返回的一个xml文件.注意过webservice的wsdl文件的朋友应该知道

Linq To Xml学习 - 2.LINQ to XML编程概述

LINQ to XML 类概述 XAttribute 类 XAttribute 表示一个 XML 属性. XCData 类 XCData 表示一个 CDATA 文本节点. XComment 类 XComment 表示一个 XML 注释. XContainer 类 XContainer 是适用于可能具有子节点的所有节点的抽 象基类.下面的类派生自 XContainer 类: XElement XDocument XDeclaration 类 XDeclaration 表示一个 XML 声明.XML

Linq To Xml学习 - 1.LINQ to XML 概述

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML. 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM). 您可以查询 和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通 过网络发送. 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型, 这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语 言方面的改进. LI