Vorgehensweise: Suchen nach verwandten Elementen (XPath-LINQ to XML) (C#)How to: Find Related Elements (XPath-LINQ to XML) (C#)

In diesem Thema wird gezeigt, wie Sie ein Element abrufen können, das auf der Basis eines Attributs ausgewählt wird, auf das vom Wert eines anderen Elements verwiesen wird.This topic shows how to get an element selecting on an attribute that is referred to by the value of another element.

Der XPath-Ausdruck lautet:The XPath expression is:

.//Customer[@CustomerID=/Root/Orders/Order[12]/CustomerID]

BeispielExample

Dieses Beispiel sucht nach dem 12. Order-Element und ermittelt anschließend den Kunden für diesen Auftrag.This example finds the 12th Order element, and then finds the customer for that order.

Beachten Sie, dass beim Indizieren von Listen in .Net die Zählung mit 0 (Null) beginnt.Note that indexing into a list in .Net is 'zero' based. Beim Indizieren einer Auflistung von Knoten in einem XPath-Prädikat beginnt die Zählung dagegen mit 1.Indexing into a collection of nodes in an XPath predicate is 'one' based. Dieser Unterschied wird im folgenden Beispiel verdeutlicht.This example reflects this difference.

In diesem Beispiel wird das folgende XML-Dokument verwendet: Beispiel-XML-Datei: Kunden und Bestellungen (LINQ to XML).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);  

Dieses Beispiel erzeugt die folgende Ausgabe: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>  

Siehe auchSee Also

LINQ to XML für XPath-Benutzer (C#)LINQ to XML for XPath Users (C#)