다음을 통해 공유


복잡한 필터링을 사용하여 쿼리를 작성하는 방법(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

참고 항목