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>

Vedi anche