加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

LINQ to XML 编程基础

发布时间:2020-12-16 00:30:18 所属栏目:百科 来源:网络整理
导读:?? 1、LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: 隐藏行号 复制代码 ? 创建 XML public static void CreateDocument() { string path = @"d:website" ; XDocument xdoc = new XDocument ( new XDeclaration ( "1.0" , "utf-8
??

1、LINQ to XML类

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

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

运行该示例将会得到一个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 = XElement root = new "Categories",
  4.  
  5.         new "Category",
  6.  
  7.             new "CategoryID",Guid.NewGuid()),21)">"CategoryName",21)">"Beverages")
    
  8.             ),
  9.  
  10.         new 
  11.             new "Condiments")
    
  12.  
  13.             ),21)">"Confections")
    
  14.  
  15.             )
    
  16.  
  17.        );
    
  18.  
  19.     root.Save(path);
    
  20.  
  21. }
    

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

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

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

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

3、XAttribute类

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

显示行号 复制代码 这是一段程序代码。
  1. public static XElement CreateCategoriesByXAttribute()
    
  2. {
    
  3.     XAttribute("Beverages")
    
  4.  
  5.             ),21)">"Condiments")
    
  6.  
  7.             ),21)">"Confections")
    
  8.  
  9.             )
    
  10.        );
    
  11.  
  12.     root.Save(path);
    
  13.  
  14.     return root;
    
  15. }
    

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

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

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

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

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

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

<?Category CategoryID="5c311c1e-ede5-41e5-93f7-5d8b1d7a0346">
    <Category CategoryID="bfde8db5-df84-4415-b297-cd04d8db9712">
    <Categories>

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

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

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

4、XDocument类

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

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

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

运行该示例将会得到一个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.  
  4.             new new                 new "食品"),21)">"Description",21)">"可以吃的东西")
    
  5.             )
    
  6.         );
    
  7.  
  8.     foreach (var item in root.Element("Category").Element("CategoryID").NodesAfterSelf())
    
  9.     {
    
  10.         Console.WriteLine((item as XElement).Value);
    
  11.     }
    
  12. }
    

二、LINQ to XML编程概念

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

1、加载已有的xml

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

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

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

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

显示行号 复制代码 这是一段程序代码。
  1.     public static void LoadFromString()
    
  2.     {
    
  3.  
  4.         XElement.Parse(@"
    
  5. 
    
  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.  
  15.         Console.WriteLine(root.ToString());
    
  16.  
  17.     }
    

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. {
    
  4.  
  5.     "Categories");
    
  6.  
  7.     using (NorthwindDataContext db = new NorthwindDataContext())
    
  8.  
  9.     {
    
  10.  
  11.         root.Add(
    
  12.  
  13.                 db.Categories
    
  14.  
  15.                 .Select
    
  16.  
  17.                 (
    
  18.  
  19.                     c => new XElement
    
  20. 
    
  21.                     (
    
  22.  
  23.                         "Category"
    
  24. 
    
  25.                         ,new                     )
    
  26.  
  27.                 )
    
  28.  
  29.             );
    
  30.  
  31.     }
    
  32.  
  33.     foreach (var item in root.Elements("Category"))
    
  34.     {
    
  35.         Console.WriteLine(item.Element("CategoryName").Value);
    
  36.  
  37.     }
    
  38.  
  39. }
    

上述代码运行的结果为:

是不是很简单呢?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. {
    
  4.  
  5.     @"
    
  6.         <Categories>
    
  7.           <Category>
    
  8.             <CategoryID>1</CategoryID>
    
  9.             <CategoryName>Beverages</CategoryName>
    
  10.             <Description>Soft drinks,and ales</Description>
    
  11.           </Category>
    
  12.         </Categories>
    
  13.     ");
    
  14.  
  15.     XElement xele = root.Element("CategoryName");
    
  16.  
  17.     xele.AddAfterSelf(new "AddDate",175)">DateTime.Now));
    
  18.  
  19.     root.Save(path);
    
  20.  
  21. }
    

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

<?xml version="1.0" encoding="utf-8"?>
<Categories>
  <Category>
    <CategoryID>1</CategoryID>
    <CategoryName>
    <AddDate>2010-01-31T03:08:51.813736+08:00</AddDate>
    <Description>Soft drinks,and ales</Description>
  </Category>
</Categories>

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

II.更新

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

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

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

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

<?ID>2</ID>
    <CategoryName>test data</Categories>

III.删除

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

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

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

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

<?Categories />

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

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

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

<?CategoryName>
  </Categories>

6、处理属性

I.添加

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

显示行号 复制代码 这是一段程序代码。
  1. public static void AddAttribute()
    
  2. {
    
  3.     new             new new "Beverages"),21)">"Soft drinks,and ales")
    
  4.         )
    
  5.     );
    
  6.  
  7.     root.Element("Category").Add(new DateTime.Now.ToShortDateString()));
    
  8.     root.Save(path);
    
  9. }
    

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

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

II.检索

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

显示行号 复制代码 这是一段程序代码。
  1. public static void SelectAttribute()
    
  2. {
    
  3.     )
    
  4.         )
    
  5.     );
    
  6.  
  7.     XAttribute xattr = root.Element("CategoryID");
    
  8.     Console.WriteLine(xattr.Name);
    
  9.     Console.WriteLine(xattr.Value);
    
  10. }
    

上述代码的运行结果为:

CategoryID

1

本文总结

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读