Jak pisać zapytania ze złożonym filtrowaniem (LINQ to XML)

Czasami chcesz napisać zapytania LINQ to XML ze złożonymi filtrami. Na przykład może być konieczne znalezienie wszystkich elementów, które mają element podrzędny o określonej nazwie i wartości. W tym artykule przedstawiono przykład pisania zapytania ze złożonym filtrowaniem.

Przykład: znajdź z zagnieżdżonym zapytaniem w klauzuli Where

W tym przykładzie pokazano, jak znaleźć wszystkie PurchaseOrder elementy, które mają:

  • Element podrzędny Address , którego Type atrybut jest równy "Wysyłka".
  • Element podrzędny State równy "NY".

Używa zagnieżdżonego zapytania w klauzuli Where , a Any operator zwraca true , jeśli kolekcja zawiera jakiekolwiek elementy. W przykładzie użyto przykładowego pliku XML dokumentu XML: wiele zamówień zakupu.

Aby uzyskać więcej informacji na temat Any operatora, zobacz Operacje kwantyfikatora (C#) i Operacje kwantyfikatora (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

Ten przykład generuje następujące wyniki:

99505

Przykład: znajdź w formacie XML, który znajduje się w przestrzeni nazw

W poniższym przykładzie pokazano to samo zapytanie co powyżej, ale w przypadku kodu XML, który znajduje się w przestrzeni nazw. Aby uzyskać więcej informacji, zobacz Omówienie przestrzeni nazw.

W tym przykładzie użyto przykładowego pliku XML dokumentu XML: wiele zamówień zakupu w przestrzeni nazw.

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

Ten przykład generuje następujące wyniki:

99505

Zobacz też