So finden Sie das unmittelbar vorangehende gleichgeordnete Element (LINQ to XML)

In diesem Artikel wird erläutert, wie XPathEvaluate Sie das gleichgeordnete Element finden, das unmittelbar vor einem Knoten steht, und wie SIE LINQ to XML-Abfrage verwenden, um dasselbe zu tun. Aufgrund des semantischen Unterschieds bei Positionsprädikaten für die Achsen vorhergehender nebengeordneter Knoten in XPath im Vergleich zu LINQ to XML ist dies einer der interessanteren Vergleiche.

Beispiel: Suchen des nächsten Elements

In diesem Beispiel verwendet die LINQ to XML-Abfrage den Last-Operator, um nach dem letzten Knoten in der Auflistung zu suchen, der von ElementsBeforeSelf zurückgegeben wurde. Im Unterschied dazu verwendet der XPath-Ausdruck für die Suche nach dem unmittelbar vorhergehenden Element ein Prädikat mit dem Wert 1.

XElement root = XElement.Parse(
    @"<Root>
    <Child1/>
    <Child2/>
    <Child3/>
    <Child4/>
</Root>");
XElement child4 = root.Element("Child4");

// LINQ to XML query
XElement el1 =
    child4
    .ElementsBeforeSelf()
    .Last();

// XPath expression
XElement el2 =
    ((IEnumerable)child4
                 .XPathEvaluate("preceding-sibling::*[1]"))
                 .Cast<XElement>()
                 .First();

if (el1 == el2)
    Console.WriteLine("Results are identical");
else
    Console.WriteLine("Results differ");
Console.WriteLine(el1);
Dim root As XElement = _
    <Root>
        <Child1/>
        <Child2/>
        <Child3/>
        <Child4/>
    </Root>
Dim child4 As XElement = root.Element("Child4")

' LINQ to XML query
Dim el1 As XElement = child4.ElementsBeforeSelf().Last()

' XPath expression
Dim el2 As XElement = _
    DirectCast(child4.XPathEvaluate("preceding-sibling::*[1]"),  _
    IEnumerable).Cast(Of XElement)().First()

If el1 Is el2 Then
    Console.WriteLine("Results are identical")
Else
    Console.WriteLine("Results differ")
End If
Console.WriteLine(el1)

Dieses Beispiel erzeugt die folgende Ausgabe:

Results are identical
<Child3 />

Siehe auch