Vorgehensweise: Ermitteln untergeordneter Elemente anhand der Position (XPath-LINQ to XML) (C#)How to: Find Child Elements Based on Position (XPath-LINQ to XML) (C#)

Es kann passieren, dass Sie Elemente anhand ihrer Position ermitteln,Sometimes you want to find elements based on their position. also z. B. das zweite oder das dritte bis fünfte Element finden möchten.You might want to find the second element, or you might want to find the third through the fifth element.

Der XPath-Ausdruck lautet:The XPath expression is:

Test[position() >= 2 and position() <= 4]

Für das Schreiben dieser LINQ to XML-Abfrage mit verzögerter Auswertung gibt es zwei Ansätze:There are two approaches to writing this LINQ to XML query in a lazy way. Sie können entweder die Operatoren Skip und Take verwenden, oder Sie können die Where-Überladung verwenden, die einen Index akzeptiert.You can use the Skip and Take operators, or you can use the Where overload that takes an index. Wenn Sie die Where-Überladung verwenden, verwenden Sie einen Lambdaausdruck, der zwei Argumente akzeptiert.When you use the Where overload, you use a lambda expression that takes two arguments. Im folgenden Beispiel werden beide Methoden für die positionsbasierte Auswahl gezeigt:The following example shows both methods of selecting based on position.

BeispielExample

Dieses Beispiel ermittelt das zweite bis vierte Test-Element.This example finds the second through the fourth Test element. Das Ergebnis ist eine Auflistung von Elementen.The result is a collection of elements.

In diesem Beispiel wird das folgende XML-Dokument verwendet: Beispiel-XML-Datei: Testkonfiguration (LINQ to XML).This example uses the following XML document: Sample XML File: Test Configuration (LINQ to XML).

XElement testCfg = XElement.Load("TestConfig.xml");  

// LINQ to XML query  
IEnumerable<XElement> list1 =  
    testCfg  
    .Elements("Test")  
    .Skip(1)  
    .Take(3);  

// LINQ to XML query  
IEnumerable<XElement> list2 =  
    testCfg  
    .Elements("Test")  
    .Where((el, idx) => idx >= 1 && idx <= 3);  

// XPath expression  
IEnumerable<XElement> list3 =  
  testCfg.XPathSelectElements("Test[position() >= 2 and position() <= 4]");  

if (list1.Count() == list2.Count() &&  
    list1.Count() == list3.Count() &&  
    list1.Intersect(list2).Count() == list1.Count() &&  
    list1.Intersect(list3).Count() == list1.Count())  
    Console.WriteLine("Results are identical");  
else  
    Console.WriteLine("Results differ");  
foreach (XElement el in list1)  
    Console.WriteLine(el);  

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

Results are identical  
<Test TestId="0002" TestType="CMD">  
  <Name>Find succeeding characters</Name>  
  <CommandLine>Examp2.EXE</CommandLine>  
  <Input>abc</Input>  
  <Output>def</Output>  
</Test>  
<Test TestId="0003" TestType="GUI">  
  <Name>Convert multiple numbers to strings</Name>  
  <CommandLine>Examp2.EXE /Verbose</CommandLine>  
  <Input>123</Input>  
  <Output>One Two Three</Output>  
</Test>  
<Test TestId="0004" TestType="GUI">  
  <Name>Find correlated key</Name>  
  <CommandLine>Examp3.EXE</CommandLine>  
  <Input>a1</Input>  
  <Output>b1</Output>  
</Test>  

Siehe auchSee Also

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