次の方法で共有


方法 : 複雑なフィルタを使用してクエリを記述する

更新 : November 2007

複雑なフィルタを使用して LINQ to XML クエリを記述することが必要になる場合があります。たとえば、特定の名前と値を持つ子要素を含む要素をすべて検索しなければならない場合があります。このトピックでは、複雑なフィルタを使用してクエリを記述する例について説明します。

使用例

この例では、Type 属性が "Shipping" で State 子要素が "NY" である Address 子要素を含む PurchaseOrder 要素をすべて検索します。この例では、入れ子になったクエリを Where 句で使用しています。コレクションに要素が含まれる場合、Any 演算子は true を返します。メソッド ベースのクエリ構文の詳細については、「クエリ構文とメソッド構文 (LINQ)」を参照してください。

この例では、「サンプル XML ファイル : 複数の購買発注書 (LINQ to XML)」の XML ドキュメントを使用しています。

Any 演算子の詳細については、「量指定子操作」を参照してください。

XElement root = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> purchaseOrders =
    from el in root.Elements("PurchaseOrder")
    where 
        (from add in el.Elements("Address")
        where
            (string)add.Attribute("Type") == "Shipping" &&
            (string)add.Element("State") == "NY"
        select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));
Dim root As XElement = XElement.Load("PurchaseOrders.xml")
Dim purchaseOrders As IEnumerable(Of XElement) = _
    From el In root.<PurchaseOrder> _
    Where _
        (From add In el.<Address> _
        Where _
             add.@Type = "Shipping" And _
             add.<State>.Value = "NY" _
        Select add) _
    .Any() _
    Select el
For Each el As XElement In purchaseOrders
    Console.WriteLine(el.@PurchaseOrderNumber)
Next

このコードを実行すると、次の出力が生成されます。

99505

次の例は名前空間に含まれている XML 用のクエリです。これらのクエリは上の例と同じ機能を表しています。詳細については、「XML 名前空間の使用」を参照してください。

この例では、「サンプル XML ファイル : 名前空間内の複数の購買発注書」の XML ドキュメントを使用しています。

XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "https://www.adventure-works.com";
IEnumerable<XElement> purchaseOrders =
    from el in root.Elements(aw + "PurchaseOrder")
    where
        (from add in el.Elements(aw + "Address")
         where
             (string)add.Attribute(aw + "Type") == "Shipping" &&
             (string)add.Element(aw + "State") == "NY"
         select add)
        .Any()
    select el;
foreach (XElement el in purchaseOrders)
    Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));
Imports <xmlns:aw='https://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim purchaseOrders As IEnumerable(Of XElement) = _
            From el In root.<aw:PurchaseOrder> _
            Where _
                (From add In el.<aw:Address> _
                Where _
                     add.@aw:Type = "Shipping" And _
                     add.<aw:State>.Value = "NY" _
                Select add) _
            .Any() _
            Select el
        For Each el As XElement In purchaseOrders
            Console.WriteLine(el.@aw:PurchaseOrderNumber)
        Next
    End Sub
End Module

このコードを実行すると、次の出力が生成されます。

99505

参照

概念

基本的なクエリ (LINQ to XML)

量指定子操作

射影操作

参照

XML 子軸プロパティ

XML 属性軸プロパティ

XML Value プロパティ

Attribute

Elements