Come concatenare chiamate al metodo axis (LINQ to XML)
Uno schema comune da usare nel codice consiste nel chiamare un metodo dell'asse e quindi chiamare uno degli assi del metodo di estensione.
Sono disponibili due assi denominati Elements
che restituiscono una raccolta di elementi: il metodo XContainer.Elements e il metodo Extensions.Elements. È possibile combinare questi due assi per individuare tutti gli elementi con un nome specificato a una data profondità dell'albero.
Esempio: recuperare tutti gli elementi del nome
In questo esempio vengono usati XContainer.Elements e Extensions.Elements per recuperare tutti gli elementi Name
inclusi in tutti gli elementi Address
di tutti gli elementi PurchaseOrder
.
Per questo esempio viene usato il documento XML seguente: File XML di esempio: più ordini di acquisto.
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
Nell'esempio viene prodotto l'output seguente:
<Name>Ellen Adams</Name>
<Name>Tai Yee</Name>
<Name>Cristian Osorio</Name>
<Name>Cristian Osorio</Name>
<Name>Jessica Arnold</Name>
<Name>Jessica Arnold</Name>
Questo esempio viene eseguito correttamente perché una delle implementazioni dell'asse Elements
è un metodo di estensione su IEnumerable<T> di XContainer. XElement deriva da XContainer, pertanto è possibile chiamare il metodo Extensions.Elements sui risultati di una chiamata al metodo XContainer.Elements.
Esempio: recuperare tutti gli elementi a una data profondità
Talvolta si intende recuperare tutti gli elementi presenti a una data profondità in cui possono non esistere predecessori intermedi. Ad esempio, nel documento seguente si vogliono recuperare tutti gli elementi ConfigParameter
che sono elementi figli dell'elemento Customer
, ma non ConfigParameter
che è un elemento figlio dell'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>
A tale scopo, è possibile usare l'asse Extensions.Elements nel modo seguente:
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
Nell'esempio viene prodotto l'output seguente:
<ConfigParameter>FirstConfigParameter</ConfigParameter>
<ConfigParameter>SecondConfigParameter</ConfigParameter>
Esempio: recuperare elementi per XML presente in uno spazio dei nomi
Nell'esempio seguente è illustrata la stessa tecnica per XML presente in uno spazio dei nomi. Per altre informazioni, vedere Panoramica degli spazi dei nomi.
Nell'esempio viene usato il documento XML File XML di esempio: più ordini di acquisto in uno spazio dei nomi.
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
Nell'esempio viene prodotto l'output seguente:
<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>