Procédure : rechercher des éléments connexes (XPath-LINQ to XML)
Cette rubrique montre comment obtenir un élément en sélectionnant un attribut auquel il est fait référence par la valeur d'un autre élément.
L'expression XPath est la suivante :
.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]
Exemple
Cet exemple recherche le douzième élément Order, puis recherche le client associé à cette commande.
Notez que l'indexation dans une liste dans .Net est basée sur « zéro ». L'indexation dans une collection de nœuds dans un prédicat XPath est basée sur « un ». Cet exemple reflète cette différence.
Cet exemple utilise le document XML suivant : Exemple de fichier XML : Clients et commandes (LINQ to XML).
XDocument co = XDocument.Load("CustomersOrders.xml");
// LINQ to XML query
XElement customer1 =
(from el in co.Descendants("Customer")
where (string)el.Attribute("CustomerID") ==
(string)(co
.Element("Root")
.Element("Orders")
.Elements("Order")
.ToList()[11]
.Element("CustomerID"))
select el)
.First();
// An alternate way to write the query that avoids creation
// of a System.Collections.Generic.List:
XElement customer2 =
(from el in co.Descendants("Customer")
where (string)el.Attribute("CustomerID") ==
(string)(co
.Element("Root")
.Element("Orders")
.Elements("Order")
.Skip(11).First()
.Element("CustomerID"))
select el)
.First();
// XPath expression
XElement customer3 = co.XPathSelectElement(
".//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]");
if (customer1 == customer2 && customer1 == customer3)
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
Console.WriteLine(customer1);
Dim co As XDocument = XDocument.Load("CustomersOrders.xml")
' LINQ to XML query
Dim customer1 As XElement = ( _
From el In co...<Customer> _
Where el.@CustomerID = co.<Root>.<Orders>.<Order>. _
ToList()(11).<CustomerID>(0).Value _
Select el).First()
' An alternate way to write the query that avoids creation
' of a System.Collections.Generic.List:
Dim customer2 As XElement = ( _
From el In co...<Customer> _
Where el.@CustomerID = co.<Root>.<Orders>.<Order>. _
Skip(11).First().<CustomerID>(0).Value _
Select el).First()
' XPath expression
Dim customer3 As XElement = co.XPathSelectElement _
(".//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]")
If customer1 Is customer2 And customer1 Is customer3 Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
Console.WriteLine(customer1)
Cet exemple génère la sortie suivante :
Results are identical
<Customer CustomerID="HUNGC">
<CompanyName>Hungry Coyote Import Store</CompanyName>
<ContactName>Yoshi Latimer</ContactName>
<ContactTitle>Sales Representative</ContactTitle>
<Phone>(503) 555-6874</Phone>
<Fax>(503) 555-2376</Fax>
<FullAddress>
<Address>City Center Plaza 516 Main St.</Address>
<City>Elgin</City>
<Region>OR</Region>
<PostalCode>97827</PostalCode>
<Country>USA</Country>
</FullAddress>
</Customer>