Compartir a través de


Procedimiento para: Buscar el nodo inmediatamente anterior del mismo nivel (LINQ to XML)

En este artículo se muestra cómo usar XPathEvaluate para buscar el elemento relacionado que precede inmediatamente a un nodo y cómo usar LINQ to XML consulta para hacer lo mismo. Debido a las diferencias de semántica de los predicados posicionales para los ejes de los elementos del mismo nivel anteriores de XPath en comparación con LINQ to XML, ésta es una de las comparaciones más interesantes.

Ejemplo: Buscar el elemento siguiente al último elemento

En este ejemplo, la consulta LINQ to XML usa el operador Last para buscar el último nodo de la recopilación devuelto por ElementsBeforeSelf. Por el contrario, la expresión XPath usa un predicado con un valor de 1 para buscar el elemento inmediatamente anterior.

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)

Este ejemplo produce el siguiente resultado:

Results are identical
<Child3 />

Vea también