How to: Find Related Elements (XPath-LINQ to XML)
This topic shows how to get an element selecting on an attribute that is referred to by the value of another element.
The XPath expression is:
.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]
Example
This example finds the 12th Order element, and then finds the customer for that order.
Note that indexing into a list in .Net is 'zero' based. Indexing into a collection of nodes in an XPath predicate is 'one' based. This example reflects this difference.
This example uses the following XML document: Sample XML File: Customers and Orders (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)
This example produces the following output:
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>