Как найти связанные элементы (XPath-LINQ to XML)
В этом разделе показано, как возвращать элемент, выбирая атрибут, обращение к которому осуществляется с помощью значения другого элемента.
Выражение XPath:
.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]
Пример
В этом примере обнаруживается 12-й элемент Order, а затем определяется клиент, сделавший этот заказ.
Обратите внимание, что индексирование в списках .NET начинается с нуля. Индексирование в коллекции узлов в предикате XPath начинается с единицы. Данное различие находит отражение в следующем примере.
В этом примере используется следующий XML-документ: Образец XML-файла. Заказчики и заказы (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)
Этот пример выводит следующие данные:
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>