Procédure : chaîner des appels à des méthodes d'axe (LINQ to XML)
Mise à jour : November 2007
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
Cet exemple utilise XContainer.Elements et Extensions.Elements pour rechercher tous les éléments Name dans tous les éléments Addressde tous les éléments PurchaseOrder.
Cet exemple utilise le document XML suivant : Exemple de fichier XML : Plusieurs commandes fournisseur (LINQ to XML).
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.
Quelquefois, vous souhaitez récupérer tous les éléments à une profondeur d'élément spécifique lorsqu'il peut y avoir ou ne pas y avoir d'ancêtres intermédiaires. Par exemple, dans le document suivant, vous pourriez souhaiter récupérer tous les éléments ConfigParameter qui sont des 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>
L'exemple suivant illustre la même technique pour du code XML qui est dans un espace de noms. Pour plus d'informations, consultez Utilisation des espaces de noms XML.
Cet exemple utilise le document XML suivant : Exemple de fichier XML : Plusieurs commandes fournisseur dans un espace de noms.
XNamespace aw = "https://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="https://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="https://www.adventure-works.com">Ellen Adams</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Tai Yee</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Cristian Osorio</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Jessica Arnold</aw:Name>
<aw:Name xmlns:aw="https://www.adventure-works.com">Jessica Arnold</aw:Name>