2009-05-20 179 views
0

我有這個問題找到一個特定的XML節點我已經發布這個問題在stackoverflow和一些不錯的研究員建議xpath。如何找到特定的xml節點?

我是一個XML新手。請我需要一個C#代碼找到父母,父母,父母(偉大的祖輩),然後找到第一個孩子,lastchild,lastchild。代碼必須迭代樹並再次下來。在線查看許多xpath教程。

我發現路徑往往是特定於已存在的特定節點的。我需要的程序不會得到任何特定的命名節點,因爲每次傳遞時都會將新節點添加到xml樹中。總而言之,我需要找到節點基地位置遠離當前節點

我的意思是找到當前節點(偉大的祖父節點)的父親父母,然後找到第一個孩子,然後找到lastchild lastchild

keepkind of currentnode.parentnode.parentnode.parentnode.firstchild.lastchild.lastchild;使用

的XPath C#

+0

請重新格式化問題,以便任何人都可以閱讀它。 – OregonGhost 2009-05-20 08:57:11

+0

請在問題中更具體。我真的不確定你想要做什麼。找到某個節點的根節點? – Razzie 2009-05-20 09:00:16

回答

5

假設你有一個名爲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

+0

嗨弗雷德裏克,沒有爲我工作我一直得到異常消息 – Spikie 2009-05-20 09:07:42

2

您提出的所有問題均由XmlNode課程回答。它有屬性ParentNode,FirstChildLastChild其中每個返回XmlNode

要做到同樣的事情在XPath中可以使用".."縮寫,以便獲得一個節點的父,和"*[position()=1]""*[position()=last()]"獲得第一和最後一個孩子,如:

XmlNode foundNode = node.SelectSingleNode("../../../*[position()=1]/*[position()=last()]/*[position()=last()]"); 

(注:」 .. 「是parent :: *軸的縮寫,」*「是」child :: *「軸的縮寫)