Procedimiento para: Encadenar llamadas de métodos de eje (LINQ to XML)

Un patrón común que puede utilizar en el código consiste en llamar a un método Axis y, después, llamar a uno de los métodos de extensión Axes.

Hay dos métodos Axes con el nombre Elements que devuelven una colección de elementos: el método XContainer.Elements y el método Extensions.Elements. Puede combinar estos dos ejes para encontrar todos los elementos de un nombre especificado en una profundidad determinada del árbol.

Ejemplo: Recuperación de todos los elementos de nombre

En este ejemplo se usa XContainer.Elements y Extensions.Elements para recuperar todos los elementos Name en todos los elementos Address de todos los elementos PurchaseOrder.

En este ejemplo se usa el documento de XML Archivo XML de ejemplo: Varios pedidos de compra.

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 ejemplo produce el siguiente resultado:

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

Esto funciona porque una de las implementaciones del eje Elements es un método de extensión en IEnumerable<T> de XContainer. XElement se deriva de XContainer, de modo que puede llamar al método Extensions.Elements según los resultados de una llamada al método XContainer.Elements.

Ejemplo: Recuperación de todos los elementos en una profundidad determinada

A veces, desea recuperar todos los elementos de una profundidad determinada cuando es posible que no intervengan antecesores. Por ejemplo, en el siguiente documento, podría recuperar todos los elementos ConfigParameter que son secundarios del elemento Customer, pero no el elemento ConfigParameter que es un secundario del elemento Root.

<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 ello, puede usar el eje Extensions.Elements de la siguiente manera:

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 ejemplo produce el siguiente resultado:

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

Ejemplo: Recuperación de elementos de XML que se encuentran en un espacio de nombres

El siguiente ejemplo muestra la misma técnica para XML que se encuentra en un espacio de nombres. Para más información, consulte Introducción a los espacios de nombres.

En este ejemplo se usa el documento XML: Archivo XML de ejemplo: varios pedidos de compra en un espacio de nombres.

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 ejemplo produce el siguiente resultado:

<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 también