Como encadear chamadas de método de eixo (LINQ to XML)

Um padrão comum que você usará em seu código é chamar um método de eixo e, em seguida, chamar um dos eixos do método de extensão.

Existem dois eixos com o nome que Elements retornam uma coleção de elementos: o XContainer.Elements método e o Extensions.Elements método. Você pode combinar esses dois eixos para encontrar todos os elementos de um nome especificado em uma determinada profundidade na árvore.

Exemplo: Recuperar todos os elementos de nome

Este exemplo usa XContainer.Elements e Extensions.Elements para recuperar todos os Name elementos em todos os Address elementos em todos os PurchaseOrder elementos.

Este exemplo usa o documento XML Sample XML file: Multiple purchase orders.

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

Este exemplo produz a seguinte saída:

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

Isso funciona porque uma das implementações do eixo é como um método de Elements extensão em IEnumerable<T> XContainer. XElement deriva de XContainer, para que você possa chamar o Extensions.Elements método nos resultados de uma chamada para o XContainer.Elements método.

Exemplo: recuperar todos os elementos em uma profundidade específica

Às vezes, você quer recuperar todos os elementos em uma determinada profundidade de elemento quando pode não haver antepassados intervenientes. Por exemplo, no documento a seguir, talvez você queira recuperar todos os ConfigParameter elementos que são filhos do Customer elemento, mas não o ConfigParameter que é filho do Root elemento.

<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>

Para fazer isso, você pode usar o Extensions.Elements eixo, da seguinte maneira:

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

Este exemplo produz a seguinte saída:

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

Exemplo: recuperar elementos para XML que está em um namespace

O exemplo a seguir mostra a mesma técnica para XML que está em um namespace. Para obter mais informações, consulte Visão geral de namespaces.

Este exemplo usa o documento XML Sample XML file: Multiple purchase orders in a namespace.

XNamespace aw = "http://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="http://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

Este exemplo produz a seguinte saída:

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

Consulte também