LINQ to XML の概要 (C#)LINQ to XML Overview (C#)

LINQ to XML には、.NET 統合言語クエリ (LINQ) フレームワークを利用したメモリ内 XML プログラミング インターフェイスが用意されています。LINQ to XML provides an in-memory XML programming interface that leverages the .NET Language-Integrated Query (LINQ) Framework. LINQ to XML では、.NET 機能を利用しており、更新および再設計されたドキュメント オブジェクト モデル (DOM) XML プログラミング インターフェイスと同等の機能を備えています。LINQ to XML uses .NET capabilities and is comparable to an updated, redesigned Document Object Model (DOM) XML programming interface.

XML は、多くのコンテキストでデータを書式設定する方法として広く採用されてきました。XML has been widely adopted as a way to format data in many contexts. たとえば、Web、構成ファイル、Microsoft Office Word ファイル、データベースで XML が使用されています。For example, you can find XML on the Web, in configuration files, in Microsoft Office Word files, and in databases.

LINQ to XMLLINQ to XML は、XML によるプログラミングのために再設計された最新の方法です。is an up-to-date, redesigned approach to programming with XML. ドキュメント オブジェクト モデル (DOM) のメモリ内ドキュメント変更機能を備え、LINQLINQ クエリ式をサポートします。It provides the in-memory document modification capabilities of the Document Object Model (DOM), and supports LINQLINQ query expressions. このクエリ式は、XPath と構文は異なりますが、機能が似ています。Although these query expressions are syntactically different from XPath, they provide similar functionality.

LINQ to XML の開発者LINQ to XML Developers

LINQ to XMLLINQ to XML は、さまざまな開発者を対象としています。targets a variety of developers. 何らかの処理を行うだけの平均的な開発者にとっては、LINQ to XMLLINQ to XML によって SQL と同じようにクエリを作成できるので、XML の操作がより簡単になります。For an average developer who just wants to get something done, LINQ to XMLLINQ to XML makes XML easier by providing a query experience that is similar to SQL. プログラマは、短時間の学習で簡潔かつ強力なクエリを、選択したプログラミング言語で記述できるようになります。With just a bit of study, programmers can learn to write succinct and powerful queries in their programming language of choice.

熟練した開発者は、LINQ to XMLLINQ to XML を使用することで生産性を大きく高めることができます。Professional developers can use LINQ to XMLLINQ to XML to greatly increase their productivity. LINQ to XMLLINQ to XML を使用すると、より少ないコードで、表現性と簡潔性に優れた強力なコードを記述できます。With LINQ to XMLLINQ to XML, they can write less code that is more expressive, more compact, and more powerful. また、同時に複数のデータ ドメインからクエリ式を使用できます。They can use query expressions from multiple data domains at the same time.

LINQ to XML とはWhat Is LINQ to XML?

LINQ to XMLLINQ to XML は、.NET Framework プログラミング言語から XML を操作できるようにする、LINQ に対応したメモリ内 XML プログラミング インターフェイスです。is a LINQ-enabled, in-memory XML programming interface that enables you to work with XML from within the .NET Framework programming languages.

LINQ to XMLLINQ to XML は、XML ドキュメントをメモリに読み込むという点で、ドキュメント オブジェクト モデル (DOM) に似ています。is like the Document Object Model (DOM) in that it brings the XML document into memory. ドキュメントに対するクエリや変更を行うことができ、変更したドキュメントをファイルに保存したり、シリアル化してインターネット経由で送信したりできます。You can query and modify the document, and after you modify it you can save it to a file or serialize it and send it over the Internet. ただし、LINQ to XMLLINQ to XML は DOM とは異なります。より軽量で使いやすく、C# の言語機能を利用する、新しいオブジェクト モデルが提供されています。However, LINQ to XMLLINQ to XML differs from DOM: It provides a new object model that is lighter weight and easier to work with, and that takes advantage of language features in C#.

LINQ to XMLLINQ to XML の最も重要な利点は、統合言語クエリ (LINQ: Language-Integrated Query)Language-Integrated Query (LINQ) と統合されていることです。The most important advantage of LINQ to XMLLINQ to XML is its integration with 統合言語クエリ (LINQ: Language-Integrated Query)Language-Integrated Query (LINQ). この統合により、メモリ内の XML ドキュメントに対するクエリを記述して、要素および属性のコレクションを取得できます。This integration enables you to write queries on the in-memory XML document to retrieve collections of elements and attributes. LINQ to XMLLINQ to XML のクエリ機能は、構文は異なりますが、XPath および XQuery と機能面で互換性があります。The query capability of LINQ to XMLLINQ to XML is comparable in functionality (although not in syntax) to XPath and XQuery. LINQLINQ に C# が統合されていることで、厳密な型指定とコンパイル時のチェックが可能となり、デバッガー サポートが強化されます。The integration of LINQLINQ in C# provides stronger typing, compile-time checking, and improved debugger support.

LINQ to XMLLINQ to XML のもう 1 つの利点は、クエリの結果を XElement および XAttribute オブジェクト コンストラクターに対するパラメーターとして使用できるので、XML ツリーを作成するための強力な方法が利用可能になります。Another advantage of LINQ to XMLLINQ to XML is the ability to use query results as parameters to XElement and XAttribute object constructors enables a powerful approach to creating XML trees. 関数型構築と呼ばれるこの方法では、開発者が XML ツリーの構造を簡単に変換できます。This approach, called functional construction, enables developers to easily transform XML trees from one shape to another.

たとえば、次の記事で説明されているように、典型的な XML の購買発注書を使用することもできます: 「サンプル XML ファイル:一般的な購買発注書 (LINQ to XML)」。For example, you might have a typical XML purchase order as described in Sample XML File: Typical Purchase Order (LINQ to XML). LINQ to XMLLINQ to XML を使用することで、次のクエリを実行して購買発注書のすべての品目要素の部品番号属性を取得できます。By using LINQ to XMLLINQ to XML, you could run the following query to obtain the part number attribute value for every item element in the purchase order:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load($"{purchaseOrderFilepath}");

IEnumerable<string> partNos =  from item in purchaseOrder.Descendants("Item")
                               select (string) item.Attribute("PartNumber");

これは、メソッドの構文の形式で書き直すことができます。This can be rewritten in method syntax form:

IEnumerable<string> partNos = purchaseOrder.Descendants("Item").Select(x => (string) x.Attribute("PartNumber"));

もう 1 つの例として、金額が $100 を超える品目を部品番号順に並べた一覧が必要であるとします。As another example, you might want a list, sorted by part number, of the items with a value greater than $100. この情報を取得するには、次のクエリを実行します。To obtain this information, you could run the following query:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load($"{purchaseOrderFilepath}");

IEnumerable<XElement> pricesByPartNos =  from item in purchaseOrder.Descendants("Item")
                                 where (int) item.Element("Quantity") * (decimal) item.Element("USPrice") > 100
                                 orderby (string)item.Element("PartNumber")
                                 select item;

これも、メソッドの構文の形式で書き直すことができます。Again, this can be rewritten in method syntax form:

IEnumerable<XElement> pricesByPartNos = purchaseOrder.Descendants("Item")
                                        .Where(item => (int)item.Element("Quantity") * (decimal)item.Element("USPrice") > 100)
                                        .OrderBy(order => order.Element("PartNumber"));

これらの LINQLINQ 機能に加え、LINQ to XMLLINQ to XML では XML プログラミング インターフェイスが機能強化されています。In addition to these LINQLINQ capabilities, LINQ to XMLLINQ to XML provides an improved XML programming interface. LINQ to XMLLINQ to XML を使用すると、次のことを実行できます。Using LINQ to XMLLINQ to XML, you can:

  • ファイルまたはストリームからの XML の読み込みLoad XML from files or streams.

  • ファイルまたはストリームへの XML のシリアル化Serialize XML to files or streams.

  • 関数型構築を使用した XML の新規作成Create XML from scratch by using functional construction.

  • XPath に類似した軸を使用した XML に対するクエリの実行Query XML using XPath-like axes.

  • AddRemoveReplaceWithSetValue などのメソッドを使用した、メモリ内の XML ツリーの操作Manipulate the in-memory XML tree by using methods such as Add, Remove, ReplaceWith, and SetValue.

  • XSD を使用した XML ツリーの検証Validate XML trees using XSD.

  • 上記の機能を組み合わせて使用した XML ツリーの構造の変換Use a combination of these features to transform XML trees from one shape into another.

XML ツリーの作成Creating XML Trees

LINQ to XMLLINQ to XML でのプログラミングで最も重要な利点の 1 つは、XML ツリーを簡単に作成できるという点です。One of the most significant advantages of programming with LINQ to XMLLINQ to XML is that it is easy to create XML trees. たとえば、小さな XML ツリーを作成するには、次のようにコードを記述します。For example, to create a small XML tree, you can write code as follows:

XElement contacts =
new XElement("Contacts",
    new XElement("Contact",
        new XElement("Name", "Patrick Hines"),
        new XElement("Phone", "206-555-0144",
            new XAttribute("Type", "Home")),
        new XElement("phone", "425-555-0145",
            new XAttribute("Type", "Work")),
        new XElement("Address",
            new XElement("Street1", "123 Main St"),
            new XElement("City", "Mercer Island"),
            new XElement("State", "WA"),
            new XElement("Postal", "68042")
        )
    )
);

詳しくは、「XML ツリーの作成 (C#)」をご覧ください。For more information, see Creating XML Trees (C#).

関連項目See also