如何:编写使用复杂筛选的查询

更新:November 2007

有时,您需要编写使用复杂筛选器的 LINQ to XML 查询。例如,您可能必须查找其子元素具有特定名称和值的所有元素。本主题提供一个编写使用复杂筛选的查询的示例。

示例

本示例演示如何查找具有 Type 属性等于“Shipping”的子 Address 元素和等于“NY”的子 State 元素的所有 PurchaseOrder 元素。示例在 Where 子句中使用嵌套查询,如果集合中有任何元素,则 Any 运算符返回 true。有关使用基于方法的查询语法的信息,请参见查询语法与方法语法 (LINQ)

本示例使用下面的 XML 文档:示例 XML 文件:多个采购订单 (LINQ to 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 属性 (Attribute) 轴属性 (Property)

XML 值属性

Attribute

Elements