Procedura: trovare elementi correlati (XPath-LINQ to XML)
In questo argomento viene illustrato come ottenere un elemento selezionando un attributo cui viene fatto riferimento dal valore di un altro elemento.
L'espressione XPath è:
.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]
Esempio
In questo esempio viene cercato il dodicesimo elemento Order e quindi il cliente relativo a tale ordine.
Notare che in .NET l'indicizzazione in un elenco è basata su 'zero'. L'indicizzazione in una raccolta di nodi di un predicato XPath è basata su 'uno'. L'esempio rispecchia questa differenza.
Nell'esempio viene utilizzato il seguente documento XML: File XML di esempio: Customers e 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)
L'output ottenuto eseguendo l'esempio è il seguente:
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>