C# LINQ to XML

  如果仅仅会LINQ基础,那么或许不能体会到LINQ功能的强大,当你了解LINQ to XML后,就不一样了......

 

一、LINQ to XML API

  可扩展标记语言(XML)是存储和交换数据的重要方法,LINQ to XML可以以两种方式和XML配合使用。第一种是作为简化的XML操作API,第二种是使用LINQ查询工具。

  从介绍LINQ to XML API开始

  LINQ to XML API由很多XML树组件的类组成,如图所示

          

其中最重要的三个类为:XDocumentXElementXAttribute,可以通过它们快速创建一棵XML树

using System;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace 简单XML使用
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xd = new XDocument(
                new XElement("MyXElement",
                new XElement("first",
                new XAttribute("color", "red"),
                new XAttribute("size", "small")),
                new XElement("second",
                new XAttribute("color", "green"),
                new XAttribute("size", "medium")),
                new XElement("third",
                new XAttribute("color", "blue"),
                new XAttribute("size", "large"))));
            Console.WriteLine(xd);
            Console.ReadKey();
        }
    }
}

对一些重要的类进行详细讲解(由于上面的例子中已经使用了下面的一些类,所以讲一些类的时候没有再继续举例子)

  1.1  XDocument类

    XDocument类提供了处理XML文档的方法,包括声明、注释和处理指令。

    XDocument类可以包含0个或一个 XDeclaration节点、XDocumentType节点和XElement节点,还可以包含任意数量的XProcessingInstruction节点

    如果XDocument中有最高级别的XElement节点,那么它就是XML树中其他元素的根,根元素可以包含任意数量的嵌套XElement、XComment或XProcessingInstruction节点

 上图演示了用于构造XML树的类以及它们如何被嵌套 (嘻嘻,图有点丑,别见怪),需要注明的是图中“1”代表可以嵌套0个或一个,“n”表示任意个

 

  1.2  XElement类

     它表示一个 XML 元素。 可以使用该类创建元素、更改元素内容;添加、更改或删除子元素;向元素中添加属性;或以文本格式序列化元素内容。

 

  1.3   XAttribute类

    XAttribute类用来处理元素的特性,特性可以是与元素相关联的“名称-值”对,也可以接受现有的XAttribute的引用。每个元素中不能有名称重复的特性。

    举个栗子。

using System;using System.Xml.Linq;

namespace 简单XML使用
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xd = new XDocument(   //创建XML树
                new XElement("root",
                new XAttribute("color", "red"),     //添加XAttribute属性
                new XAttribute("size", "large"),
                new XElement("first")
                )
            );
            Console.WriteLine(xd);
            XElement rt = xd.Element("root");//获取元素
            XAttribute color = rt.Attribute("color");//获取特性
            XAttribute size = rt.Attribute("size");

            Console.WriteLine("color: {0}", color);//显式特性
            Console.WriteLine("size: {0}", size.value);
            Console.ReadKey();
        }
    }
}

                        注意一个是直接输出color,另一个是size.value

 

  1.4  XDeclaration类

    XML声明,可以声明包含XML使用的版本号、字符编码类型以及文档是否依赖于外部引用。

new XDeclaration("2.0", "utf-8", "yes")

  这段代码产生的XML文档为:<?xml version="2.0" encoding="utf-8" standalone="yes"  ?>

 

  1.5 XProcessingInstruction类

    XML处理指令用于提供XML文档如何被使用和翻译的额外数据,最常见的就是把处理指令用于关联XML文档和一个样式表。

    我们可以使用XProcessingInstruction构造函数来包含处理指令。它接受两个字符串参数:目标和数据串。如果处理指令接受多个数据参数,这些参数必须包含在XProcessingInstruction构造函数的第二个字符串中,如下面的代码所示。

new XProcessingInstruction("xml-stylesheet",@"href=""stories"", type=""text/css""")

产生的XML文档为: <?xml-stylesheet href="stories", type="text/css"?>

注意示例中第二个参数是一个字符串,在字符串中的双引号文本使用两个连续的双引号来表现

 

二、使用XML树的值

  当我们遍历XML树来获取或修改值时才体现出XML的强大。下表给出了用于获取数据的主要方法

方法名称返回类型描述
NodesXDocument、XElementIEnumerable<object>返回当前节点的所有子节点(不管是什么类型)
ElementsXDocument、XElementIEnumerable<XElement>返回当前节点的XElement子节点,或所有具有某个名字的子节点
ElementXDocument、XElementXElement返回当前节点的第一个XElement子节点,或具有某个名字的子节点
DescendantsXElementIEnumerable<XElement>返回所有的XElement子代节点,或所有具有某个名字的XElement子代节点,不管它们处于当前节点下嵌套的什么层次
DescendantsAndSelfXElementIEnumerable<XElement>和Descendants一样,不过包含当前节点
AncestorsXElementIEnumerable<XElement>返回所有上一级XElement节点,或者所有具有某个名字的上级XElement节点
AncestorsAndSelfXElementIEnumerable<XElement>和Ancestors一样,但包含当前节点
ParentXElementXElement返回当前节点的父节点

  关于表中的方法,需要了解的一些重要事项如下:

  a:  Nodes  Nodes方法返回IEnumerable<object>类型的对象,因为返回的节点可能是不同类型,比如XElement、XComment等。我们可以使用以类型作为参数的方法OfType(type)来指定返回某个类型的节点,下面代码只获取XComment节点

IEnumerable<XComment> comments = xd.Nodes().OfType<XComment>();

  b:  Elements  由于获取XElement是一个非常普遍的需求,就出现了Nodes.OfType<XElement>()表达式的简短形式-------Elements方法

           使用无参数的Elements方法返回所有的子Elements。

           使用单个name参数的Elements方法只返回具有这个名字的子XElements

IEnumerable<XElement> empPhone = emp.Elements("PhoneNumber");

    Element用法与其类似

  c:  Descendants和Ancestors用法与Elements差不多,只不过它们不返回直接的子元素,而是忽略嵌套级别,包含所有之下或者之上的节点

 

三、操纵XML

  LINQ to XML一个重要的特性是能够方便地修改xml树,下表列出了最重要的一些操纵XML的方法

方法名称从哪里调用        描述
Add父节点在当前节点的既有子节点后增加新的子节点
AddFirst父节点在当前节点的既有子节点前增加新的子节点
AddBeforeSelf节点在同级别的当前节点之前增加新节点
AddAfterSelf节点在同级别的当前节点之后增加新节点
Remove节点删除当前所选的节点及其内容
RemoveNodes节点删除当前所选的XElement及其内容
SetElement父节点设置节点内容
ReplaceContent节点替换节点内容

  让我们来看看这些方法怎么使用(注:下面的代码建立在前面的基础上)

 

  3.1  添加

 XElement rt = xd.Element("root");
 rt.Add(new XElement("second", "2"));

  执行后将在first节点后增加一个新节点

  AddFirst等方法你们可以自己试试,这样更能加深印象,用法也差不多(不会告诉你是因为我太懒了不愿写的)

 

  3.2  删除

XElement rt1 = rt.Element("second");
rt1.Remove();

  上面代码将例2.1创建的节点删除。

  也可以使用RemoveAll()方法

 

  3.3  更新

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

rt.Element("first").ReplaceWith(new XElement("NewFirst"));
rt.SetElementValue("second", "two");

上述代码将名为first节点的名字改变为NewFirst,名为second节点的值设置为two

 

   你若坚持,定会发光,时间是所向披靡的武器,它能集腋成裘,也能聚沙成塔,将人生的不可能都变成可能。

   如果觉得文章不错,请点个赞吧!

 

转载于:https://www.cnblogs.com/forever-Ys/p/10324833.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值