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

另請參閱