2013-07-19 39 views
0

我試圖選擇具有父名item20使用XPath表達式//Prp[@name='node name'and ../../../*[@name='item20']]節點Prp[@name='node name']但如果我的文件包含XML的只有這部分這隻適用:問題與特定的名字中選擇一個節點時

<Node name="item20"> 
<Node name="config"> 
    <Node name="runmodeparams"> 
    <Node name="simple"> 
     <Prp name="filename" type="S" value="p"/> 
     <Prp name="filepath" type="S" value="r"/> 
    </Node> 
    <Prp name="activerunmode" type="S" value="Simple"/> 
    </Node> 
    <Prp name="node name" type="S" value="lastversion"/> 
</Node>   

如果它還包含XML文件的另一部分,如下所示,那麼XPath會返回一個空結果。

<Node name="item20"> 
<Node name="config"> 
    <Node name="runmodeparams"> 
    <Node name="simple"> 
     <Prp name="filename" type="S" value="p"/> 
     <Prp name="filepath" type="S" value="r"/> 
    </Node> 
    <Prp name="activerunmode" type="S" value="Simple"/> 
    </Node> 
    <Prp name="node name" type="S" value="lastversion"/> 
</Node>   
</Node> 

<Node name="item21"> 
<Node name="config"> 
    <Node name="runmodeparams"> 
    <Node name="simple"> 
     <Prp name="filename" type="S" value="p"/> 
     <Prp name="filepath" type="S" value="r"/> 
    </Node> 
    <Prp name="activerunmode" type="S" value="Simple"/> 
    </Node> 
    <Prp name="node name" type="S" value="lastversion"/> 
</Node>   
</Node> 

如何正確選擇節點?

回答

0

您提供的第二個XML代碼段是無效的XML,因爲它包含兩個根節點。如果這真的是你的完整的XML輸入,你應該

  1. 修復它,如果可能的話,還是有點單一根節點把它包裝和
  2. 嘗試從您的XPath引擎抓取了一些錯誤信息。

我把它包裝在另一個元素中,你的第二個XPath有點工作 - 但可能沒有返回預期的結果; item20和item21的節點名稱元素會在您走出太遠時返回。

不管怎樣,你最好在謂詞檢查「item20」下臺的XML樹時:

//Node[@name='item20']//Prp[@name='node name'] 

這不僅限制你要找的節點,也應該更快對於大多數情況。


如果表現確實問題,你要尋找的<Prp/>元素總是在相同的位置,儘量避免後代或自身步驟//,並提供完整的獨特路徑,這將是

//Node[@name='item20']/Prp[@name='node name'] 
+0

我回顧了第二個xml和xpath的結構// Node [@ name ='item20'] // Prp [@ name ='node name'],它工作正常。謝謝 ! –

相關問題