如何使用复杂筛选编写查询 (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