转自:http://www.hubwiz.com/

概述

    LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在.NET Framework 编程语言中处理 XML。

  它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。 您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过网络发送。 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便。

  LINQ to XML 最重要的优势是它与 Language-Integrated Query (LINQ) 的集成。 由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和XQuery 具有可比性。

  通过将查询结果用作 XElement 和 XAttribute 对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。 这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。

另外在使用代码LINQ to XML时要用到using System.Xml.Linq;空间,它为我们提供了要处理XML文档的接口与方法。


创建XML元素

    LINQ to XML使用XElement类创建元素。如下例子:


using System;

using System.Xml.Linq;

using System.IO;

namespace xmltest

{

   class Program

   {

       static void Main(string[] args)

       {

           XElement xml =

               new XElement("Persons",

                   new XElement("Person",

                       new XElement("Name", "John"),

                       new XElement("Age", "28")

                       ),

                   new XElement("Person",

                       new XElement("Name", "Tom"),

                       new XElement("Age", "27")

                       )

                   );

           string xmlstr=xml.ToString();

           // xml.Save(@"Data.xml");  //保存到文件

           Console.WriteLine(xmlstr);

       }

   }

}


运行结果为:


<Persons>

 <Person>

   <Name>John</Name>

   <Age>28</Age>

 </Person>

 <Person>

   <Name>Tom</Name>

   <Age>27</Age>

 </Person>

</Persons>


创建XML文档

      LINQ to XML使用XDocument类创建文档。如下例子:



static void Main()

{

var xDoc = new XDocument(new XElement( "root",

           new XElement("dog",  //创建元素节点

             new XText("dog said black is a beautify color"), //创建节点值

             new XAttribute("color", "black")), //创建属性节点

           new XElement("cat"),

           new XElement("pig", "pig is great")));

 

       //xDoc输出xml的encoding是系统默认编码

       //默认是缩进格式化的xml,而无须格式化设置

       string xmlstr = xDoc.ToString();

        //xDoc.Save(@"data.xml");  //xml文件中会比显示的多一行

      Console.WriteLine(xmlstr);

}


运行结果为:


<root>

 <dog color="black">dog said black is a beautify color</dog>

 <cat/>

 <pig>pig is great</pig>

</root>




查询XML结点

      Linq是从集合中查询对象,在linq to xml中的集合是通过XElement类的Elements(),Elements(string name),以及Descendants、DescendantsAndSelf、Ancestors、AncestorsAndSelf的几个重载方法中获得。获得XElement集合之后,可以通过XElementAttribute(string name)方法获得元素的属性值,可以通过XElementValue属性获得节点的文本值;



static void Main(string[] args)

{

   string xmlString = @"<persons>

                            <person>

                                <name>John</name>

                                <age>28</age>

                            </person>

                        </persons>";

   XElement xe = XElement.Parse(xmlString,LoadOptions.SetLineInfo);

   //读取元素  读取Name的后面的第一个兄弟元素

   XElement xe1 = xe.Element("person").Element("name").ElementsAfterSelf().First();

   Console.WriteLine(xe1.Value);   //输出 28

   //读取父节点

   XElement xe2 = xe1.Parent;

   Console.WriteLine(xe2.Name);

}


修改XML

        修改XML也非常简单,可以通过XElement的Add,Remove,RemoveAll等方法对xml文档进行修改。如下代码:


static void Main(string[] args)

{

    string xmlString = @"<Persons>

                           <Person>

                               <Name>John</Name>

                               <Age>28</Age>

                              </Person>

                       </Persons>";

  XElement xe = XElement.Parse(xmlString, LoadOptions.SetLineInfo);

 

   //这是添加在最后,如果想添加在最前面可以使用AddFirst,

   //添加在本节点之前AddBeforSelf,添加在本节点之后AddAfterSelf

  xe.Add(new XElement("Person",

                 new XElement("Name", "Tom"),

               new XElement("Age", 26)

                   )

         );

   //删除所有子节点

   xe.RemoveAll();

 

   TextWriter tw = new StringWriter();

//第二个参数SaveOptions枚举支持设置格式,缩进,保留无关重要的空白,去除重复命名空间

   xe.Save(tw, SaveOptions.None);

   Console.WriteLine(tw);

}



遍历XML

      我们用linq to xml 遍历xml文档可以用以下三种方法,如下代码:

static void Main(string[] args)

{

XElement xel = XElement.Parse(@"

                     <Root>

                       <Persons>

                         <Person>Huang Cong</Person>

                         <Person>Zhang San</Person>

                         <Person>Li Si</Person>

                         <Person>Wang Wu</Person>

                       </Persons>

                     </Root>");

Console.WriteLine("Used XNode:");

foreach (XNode n in xel.Nodes())

{

   Console.WriteLine(n);

}

Console.WriteLine("----------------------------");

 

Console.WriteLine("Used XElement:");

foreach (XElement e in xel.Elements("Persons"))

{

   Console.WriteLine(e);

}

Console.WriteLine("----------------------------");

 

Console.WriteLine("Used Lambda:");

var query = xel.Elements().Select(u => u);

foreach (var q in query)

{

   Console.WriteLine(q);

}

}