Guide pratique pour chaîner des appels à des méthode d’axe (LINQ to XML)

Un schéma courant que vous utiliserez dans votre code consiste à appeler une méthode d’axe, puis à appeler l’un des axes de méthode d’extension.

Il existe deux axes avec le nom Elements qui retournent une collection d'éléments : la méthode XContainer.Elements et la méthode Extensions.Elements. Vous pouvez combiner ces deux axes pour rechercher tous les éléments d’un nom spécifié à une profondeur donnée dans l’arborescence.

Exemple : Récupérer tous les éléments de nom

Cet exemple utilise XContainer.Elements et Extensions.Elements pour récupérer tous les éléments Name dans tous les éléments Address dans tous les éléments PurchaseOrder.

Cet exemple utilise le document XML exemple de fichier XML : plusieurs commandes d’achat.

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

Cet exemple produit la sortie suivante :

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

Cela fonctionne car l'une des implémentations de l'axe Elements est en tant que méthode d'extension sur l'objet IEnumerable<T> de XContainer. XElement dérivant de XContainer, vous pouvez appeler la méthode Extensions.Elements sur les résultats d'un appel à la méthode XContainer.Elements.

Exemple : Récupérer tous les éléments à une profondeur particulière

Parfois, vous souhaitez récupérer tous les éléments à une profondeur d’élément particulière lorsqu’il peut ne pas y avoir d’ancêtres intermédiaires. Par exemple, dans le document suivant, vous pouvez récupérer tous les éléments ConfigParameter enfants de l’élément Customer, mais pas le ConfigParameter qui est un enfant de l’élément 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>

Pour cela, vous pouvez utiliser l'axe Extensions.Elements comme suit :

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

Cet exemple produit la sortie suivante :

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

Exemple : Récupérer des éléments pour XML qui se trouve dans un espace de noms

L’exemple suivant montre la même technique pour XML qui se trouve dans un espace de noms. Pour plus d’informations, consultez vue d’ensemble des espaces de noms.

Cet exemple utilise le document XML Exemple de fichier XML : plusieurs commandes fournisseur dans un espace de noms.

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

Cet exemple produit la sortie suivante :

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

Voir aussi