如何撰寫包含複雜篩選的查詢 (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