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>