방법: 축 메서드 호출 연결(LINQ to XML)

코드에 사용할 수 있는 일반적인 방법은 축 메서드를 호출한 다음 확장 메서드 축 중 하나를 호출하는 것입니다.

요소의 컬렉션을 반환하며 Elements의 이름이 포함된 두 축인 XContainer.Elements 메서드와 Extensions.Elements 메서드가 있습니다. 이러한 두 축을 결합하여 트리의 특정 깊이에서 지정된 이름의 모든 요소를 찾을 수 있습니다.

예제

이 예제에서는 XContainer.ElementsExtensions.Elements를 사용하여 모든 PurchaseOrder 요소의 모든 Address 요소에 있는 모든 Name 요소를 찾습니다.

이 예제에서는 XML 문서로 샘플 XML 파일: 여러 구매 주문(LINQ to XML)을 사용합니다.

XElement purchaseOrders = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> names =
    from el in purchaseOrders
        .Elements("PurchaseOrder")
        .Elements("Address")
        .Elements("Name")
    select el;
foreach (XElement e in names)
    Console.WriteLine(e);
Dim purchaseOrders As XElement = XElement.Load("PurchaseOrders.xml")
Dim names As IEnumerable(Of XElement) = _
    From el In purchaseOrders.<PurchaseOrder>.<Address>.<Name> _
    Select el
For Each e As XElement In names
    Console.WriteLine(e)
Next

이 예제는 다음과 같이 출력됩니다.

<Name>Ellen Adams</Name>
<Name>Tai Yee</Name>
<Name>Cristian Osorio</Name>
<Name>Cristian Osorio</Name>
<Name>Jessica Arnold</Name>
<Name>Jessica Arnold</Name>

이는 Elements 축의 구현 중 하나가 XContainerIEnumerable<T>에 대한 확장 메서드이기 때문에 작동합니다. XElementXContainer에서 파생되므로 XContainer.Elements 메서드에 대한 호출의 결과에 대해 Extensions.Elements 메서드를 호출할 수 있습니다.

중간에 상위 요소가 있을 수도 있고 없을 수도 있는 특정 요소 깊이에서 모든 요소를 검색하려는 경우가 있습니다. 예를 들어, 다음 문서에서 Customer 요소의 자식인 모든 ConfigParameter 요소를 검색하고 Root 요소의 자식인 ConfigParameter는 검색하지 않으려고 할 수 있습니다.

<Root>
  <ConfigParameter>RootConfigParameter</ConfigParameter>
  <Customer>
    <Name>Frank</Name>
    <Config>
      <ConfigParameter>FirstConfigParameter</ConfigParameter>
    </Config>
  </Customer>
  <Customer>
    <Name>Bob</Name>
    <!--This customer doesn't have a Config element-->
  </Customer>
  <Customer>
    <Name>Bill</Name>
    <Config>
      <ConfigParameter>SecondConfigParameter</ConfigParameter>
    </Config>
  </Customer>
</Root>

이렇게 하려면 Extensions.Elements 축을 다음과 같이 사용하면 됩니다.

XElement root = XElement.Load("Irregular.xml");
IEnumerable<XElement> configParameters = 
    root.Elements("Customer").Elements("Config").
    Elements("ConfigParameter");
foreach (XElement cp in configParameters)
    Console.WriteLine(cp);
Dim root As XElement = XElement.Load("Irregular.xml")
Dim configParameters As IEnumerable(Of XElement) = _
    root.<Customer>.<Config>.<ConfigParameter>
For Each cp As XElement In configParameters
    Console.WriteLine(cp)
Next

이 예제는 다음과 같이 출력됩니다.

<ConfigParameter>FirstConfigParameter</ConfigParameter>
<ConfigParameter>SecondConfigParameter</ConfigParameter>

다음 예제에서는 네임스페이스에 있는 XML에 대한 동일한 기법을 보여 줍니다. 자세한 내용은 XML 네임스페이스 작업을 참조하십시오.

이 예제에서는 XML 문서로 샘플 XML 파일: 네임스페이스의 여러 구매 주문을 사용합니다.

XNamespace aw = "https://www.adventure-works.com";
XElement purchaseOrders = XElement.Load("PurchaseOrdersInNamespace.xml");
IEnumerable<XElement> names =
    from el in purchaseOrders
        .Elements(aw + "PurchaseOrder")
        .Elements(aw + "Address")
        .Elements(aw + "Name")
    select el;
foreach (XElement e in names)
    Console.WriteLine(e);
Imports <xmlns:aw="https://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim purchaseOrders As XElement = XElement.Load("PurchaseOrdersInNamespace.xml")
        Dim names As IEnumerable(Of XElement) = _
            From el In purchaseOrders.<aw:PurchaseOrder>.<aw:Address>.<aw:Name> _
            Select el
        For Each e As XElement In names
            Console.WriteLine(e)
        Next
    End Sub
End Module

이 예제는 다음과 같이 출력됩니다.

<aw:Name xmlns:aw="https://www.adventure-works.com">Ellen Adams</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Tai Yee</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Jessica Arnold</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Jessica Arnold</aw:Name>

참고 항목

개념

LINQ to XML 축