HOW TO:尋找正前面的同層級 (XPath - LINQ to XML)
更新: November 2007
有時候您會想要尋找節點正前面的同層級。由於前面同層級座標軸的位置性述詞語意 (Semantics) 在 XPath 中與 LINQ to XML 相反的這個差異,這是其中一個更有趣的比較。
範例
在這個範例中,LINQ to XML 查詢會使用 Last 運算子,尋找集合中由 ElementsBeforeSelf 傳回的最後一個節點。相較之下,XPath 運算式會使用述詞搭配 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)
此範例會產生下列輸出:
Results are identical
<Child3 />