假設你有一個名爲node
一個XmlNode實例入手。然後下面的代碼會給你該節點的偉大盛大父母的第一個孩子的最後一個孩子的最後一個子:
XmlNode wantedNode = node.ParentNode.ParentNode.ParentNode.FirstChild.LastChild.LastChild;
注意,有這麼多的事情可以去錯了這個代碼。如果任何引用的節點碰巧爲null,那麼您將會遇到NullReferenceException。因此,您需要在每個級別進行空值檢查:
XmlNode wantedNode;
if (node.ParentNode != null && node.ParentNode.ParentNode != null /* and so on through the full path */)
{
wantedNode = node.ParentNode.ParentNode.ParentNode.FirstChild.LastChild.LastChild;
}
讓我們用更具體的示例來檢查它。假設我們有下面的XML文檔:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<greatgrandparent>
<grandparent>
<parent id="1">
<child somevalue="3"></child>
</parent>
<parent id="2">
<child somevalue="4"></child>
<child somevalue="5"></child>
</parent>
</grandparent>
</greatgrandparent>
</root>
如果我明白你的問題吧,如果我們從我們要導航到<child somevalue="5"></child>
節點<child somevalue="3"></child>
開始。上面的代碼示例將執行此操作。但是,如前所述,如果不是所有預期的節點都存在,則容易出現異常。
即使你說你想要c#代碼而不是XPath,在這種情況下,我覺得XPath是要走的路。有很多方法可以解決這個問題。舉例來說,如果節點有不同的標籤名稱(如我的樣本文檔中),可以改爲這樣做:
XmlNode wantedNode = node.SelectSingleNode("ancestor::greatgrandparent/grandparent[position()=1]/parent[position()=last()]/child[position()=last()]");
if (wantedNode != null)
{
// the path was found
}
當然這是假設node
不是空的,但有效的XmlNode實例。
擊穿的XPath表達式:
- 祖先:: greatgrandparent - >這將找到名爲「greatgrandparent」位於任何地方向上的層次結構(所以任何父,宏偉的父等)的任何節點
- /祖父母[位置()= 1] - >名爲 「祖父母」 的第一個子節點
- /父[位置()=最後()] - >名爲 「父」 的最後一個子節點
- /child [position()= last()] - >最後一個名爲「child」的子節點
如果您想了解XPath軸的工作方式,請參閱w3schools.com。
請重新格式化問題,以便任何人都可以閱讀它。 – OregonGhost 2009-05-20 08:57:11
請在問題中更具體。我真的不確定你想要做什麼。找到某個節點的根節點? – Razzie 2009-05-20 09:00:16