2014-06-16 100 views
1

因此,在另一個節點指定一個ID,我有XML文檔這樣的:如何找到XML節點使用XPath的

<main> 
    <objects> 
     <object> 
      <objectid>1</objectid> 
      <parentid>0</parentid> 
      <type>1</type> 
     </object> 
     <object> 
      <objectid>2</objectid> 
      <parentid>1</parentid> 
      <type>2</type> 
     </object> 
     <object> 
      <objectid>3</objectid> 
      <parentid>1</parentid> 
      <type>1</type> 
     </object> 
     <object> 
      <objectid>4</objectid> 
      <parentid>2</parentid> 
      <type>2</type> 
     </object> 
    </objects> 
</main> 

我能找到,使用XPath,具有type = 2具有objectid = parentid所有節點的節點這個節點?

隨着xmllint,我能找到的所有節點wwith給定類型:

xpath //main/objects/object[type[text()=2]] 

但接下來呢? (搜索應該返回第一,第三和第四個節點object

+0

這將在你的例子返回一個*空集*(因爲沒有'object'與'objectId'具有相同值作爲'parentId')是你想要什麼? – helderdarocha

+0

objectid = 4的對象具有parentid = 2;我想查找對象objectid = 2 –

回答

2

問題不明確,你想找到type = 2的節點,並且該節點的對象等於該節點的parentid?

/main/objects/object[type[text()='2'] and objectid = parentid] 

但是,你會不會返回示例中的任何對象?

+0

我想找到(A)有類型= 2的節點(B)從(A) –

+0

得到的節點有objectid = parentid但是這是不可能的一個表達式,因爲您可以選擇具有類型2的對象,但是不能返回到xml中的三個對象以選擇具有對象的對象作爲parentid。 – stefferd

+0

你在xslt中使用它,還是你在使用它,因爲那麼你必須將選擇保存在一個變量中,然後用變量 – stefferd

0

這並不完全清楚你想獲得什麼,所以我包括幾種選擇基於他們的孩子的對象的選擇。

,你所說的「父母」的文件(由同級對象通過parentid提到的那些)的對象可以使用選擇:

//main/objects/object[objectid=../object/parentid] 

將在選擇前兩個object節點您例。

您可以添加額外的謂詞,以進一步限制選擇。如果你想只在有type='2'元素的背景下,上述限制,那麼你可以使用:

//main/objects/object[type='2'][objectid=../object/parentid] 

將只選擇第二個節點。

反轉是(選擇節點,其parentid等於任何兄弟姐妹的objectid會選擇最後三個節點:

/main/objects/object[parentid=../object/objectid] 

限制範圍內的type='2'節點,那麼你得到的第二個和最後一個object元素與這個表達式:

/main/objects/object[type='2'][parentid=../object/objectid]