Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird gezeigt, wie Sie mit XPathSelectElements Elemente basierend auf der Elementposition suchen, z. B. um das zweite Element oder das dritte bis fünfte Element zu finden. Außerdem werden zwei Möglichkeiten für die Verwendung der LINQ to XML-Abfrage zum gleichen Zweck gezeigt.
Für das Schreiben dieser LINQ to XML-Abfrage mit verzögerter Auswertung gibt es zwei Ansätze. Sie können entweder die Operatoren Skip und Take verwenden, oder Sie können die Where-Überladung verwenden, die einen Index akzeptiert. Wenn Sie die Where-Überladung verwenden, verwenden Sie einen Lambdaausdruck, der zwei Argumente akzeptiert. Im folgenden Beispiel werden beide Methoden für die positionsbasierte Auswahl gezeigt:
Beispiel: Das zweite bis vierte Test-Element suchen
In diesem Beispiel wird das zweite bis vierte Test-Element in der XML-Beispieldatei: Testkonfiguration gesucht. Das Ergebnis ist eine Auflistung von Elementen.
Der XPath-Ausdruck lautet Test[position() >= 2 and position() <= 4].
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);
Dim testCfg As XElement = XElement.Load("TestConfig.xml")
' LINQ to XML query
Dim list1 As IEnumerable(Of XElement) = _
testCfg.Elements("Test").Skip(1).Take(3)
'LINQ to XML query
Dim list2 As IEnumerable(Of XElement) = _
testCfg.Elements("Test"). _
Where(Function(ByVal el, ByVal idx) idx >= 1 And idx <= 3)
' XPath expression
Dim list3 As IEnumerable(Of XElement) = _
testCfg.XPathSelectElements("Test[position() >= 2 and position() <= 4]")
If list1.Count() = list2.Count() And _
list1.Count() = list3.Count() And _
list1.Intersect(list2).Count() = list1.Count() And _
list1.Intersect(list3).Count() = list1.Count() Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
For Each el As XElement In list1
Console.WriteLine(el)
Next
Dieses Beispiel erzeugt die folgende Ausgabe:
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>