Linq 简明教程

LINQ - XML

LINQ to XML 提供了对所有 LINQ 功能的轻松访问,例如标准查询运算符、编程接口等。LINQ to XML 集成了 .NET 框架中,还可以充分利用 .NET 框架功能,如调试、编译时检查、强类型等等。

Introduction of LINQ to XML

在使用 LINQ to XML 时,可以轻松地将 XML 文档加载到内存中,并且更容易查询和修改文档。还可以将内存中现有的 XML 文档保存到磁盘并对其进行序列化。它消除了开发人员学习有些复杂的 XML 查询语言的需要。

LINQ to XML 的功能在 System.Xml.Linq 命名空间中。这拥有 19 个与 XML 配合使用必不可少的类。这些类如下。

  1. XAttribute

  2. XCData

  3. XComment

  4. XContainer

  5. XDeclaration

  6. XDocument

  7. XDocumentType

  8. XElement

  9. XName

  10. XNamespace

  11. XNode

  12. XNodeDocumentOrderComparer

  13. XNodeEqualityComparer

  14. XObject

  15. XObjectChange

  16. XObjectChangeEventArgs

  17. XObjectEventHandler

  18. XProcessingInstruction

  19. XText

Read an XML File using LINQ

C

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
                           "<Department>Account</Department>" & vbCr & vbLf &
                           "<Department>Sales</Department>" & vbCr & vbLf &
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf &
                           "<Department>Marketing</Department>" & vbCr & vbLf &
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

当以上 C# 或 VB 代码被编译并执行时,它会生成以下结果 -

Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing

Press any key to continue.

Add New Node

C

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Add new Element
         xdoc.Element("Departments").Add(new XElement("Department", "Finance"));

         //Add new Element at First
         xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
     	                   "<Department>Account</Department>" & vbCr & vbLf &
     	                   "<Department>Sales</Department>" & vbCr & vbLf &
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf &
     	                   "<Department>Marketing</Department>" & vbCr & vbLf &
     	                   "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Element("Departments").Add(New XElement("Department", "Finance"))

      xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

当以上 C# 或 VB 代码被编译并执行时,它会生成以下结果 -

Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

Deleting Particular Node

C

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Support</Department>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       <Department>Finance</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Remove Sales Department
         xdoc.Descendants().Where(s =>s.Value == "Sales").Remove();

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
     	                   "<Department>Support</Department>" & vbCr & vbLf &
     	                   "<Department>Account</Department>" & vbCr & vbLf &
     	                   "<Department>Sales</Department>" & vbCr & vbLf &
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf &
     	                   "<Department>Marketing</Department>" & vbCr & vbLf &
     	                   "<Department>Finance</Department>" & vbCr & vbLf &
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

当以上 C# 或 VB 代码被编译并执行时,它会生成以下结果 -

Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.