複雑なフィルターを使用してクエリを記述する方法 (LINQ to XML)
複雑なフィルターを使用して LINQ to XML クエリを記述することが必要になる場合があります。 たとえば、特定の名前と値を持つ子要素を含む要素をすべて検索しなければならない場合があります。 この記事では、複雑なフィルターを使用してクエリを記述する例について説明します。
例: Where
句で入れ子になったクエリを使用して検索する
この例では、次を持つ PurchaseOrder
要素を検索する方法を示します。
Type
属性が "Shipping" のAddress
子要素。- "NY" と等しい
State
子要素。
この例では、入れ子になったクエリを Where
句で使用しています。コレクションに要素が含まれる場合、Any
演算子は true
を返します。 この例では、「サンプル XML ファイル: 複数の購買発注書」の XML ドキュメントを使用します。
Any
演算子の詳細については、「量指定子操作 (C#)」および「量指定子操作 (Visual Basic)」を参照してください。
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 = "http://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='http://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
関連項目
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET