Linq-xml

提供:Dev Guides
移動先:案内検索

LINQ-XML

LINQ to XMLは、標準クエリ演算子、プログラミングインターフェイスなどのすべてのLINQ機能への簡単なアクセスを提供します。 .NETフレームワークに統合されたLINQ to XMLは、デバッグ、コンパイル時のチェック、厳密な型指定など、.NETフレームワークの機能を最大限に活用します。

LINQ to XMLの紹介

LINQ to XMLを使用している間、XMLドキュメントをメモリに読み込むのは簡単で、クエリとドキュメントの変更はより簡単です。 また、メモリ内に存在するXMLドキュメントをディスクに保存し、シリアル化することもできます。 開発者がやや複雑なXMLクエリ言語を習得する必要がなくなります。

LINQ to XMLは、System.Xml.Linq名前空間にその力を持っています。 これには、XMLを操作するために必要な19のクラスがすべてあります。 これらのクラスは次のとおりです。

  • XAttribute
  • XCData
  • XComment
  • XContainer
  • XDeclaration
  • XDocument
  • XDocumentType
  • XElement
  • XName
  • XNamespace
  • XNode
  • XNodeDocumentOrderComparer
  • XNodeEqualityComparer
  • XObject
  • XObjectChange
  • XObjectChangeEventArgs
  • XObjectEventHandler
  • XProcessingInstruction
  • XText

LINQを使用してXMLファイルを読み取る

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.

新しいノードを追加

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.

特定のノードを削除する

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.