2012-10-23 72 views
1
<?xml> 
<env> 
<body> 
<folderxml> 
<folder id='1'> 
<folder id='2' name ='document'> 
    <folder id='3' name ='Music'> 
    <folder id= '4' name= 'album' xlink='true'> 
    </folder> 
    </folder> 
</folder> 
</folder> 
</folderxml> 
</body> 
</env> 

如果屬性'link'爲true,我需要路徑。像xpath.evaluate(路徑if(link = true))。結果應該是像「/文件/音樂/專輯」使用Xpath查找一個屬性的祖先

+2

似乎不是一個有效的XML –

回答

0

應用以下XPath表達式(基於XPath tutorial)後:

xmlXPathEval("//*[@xlink='true']", doc) 

你獲得一個鏈接到節點列表。在該示例中,它是單個節點folderid4。然後你需要編寫一個函數來遍歷所有父母,並連接他們的name屬性。

如果你需要匹配的文件夾的名稱即可,比你能與

xmlXPathEval("string(//*[@xlink='true']/@name)", doc) 

去讀取結果的stringval成員。但是那隻匹配第一個節點。

編輯:至於函數迭代父母我想通過xmlNodePtr->parent成員直接訪問和閱讀屬性與xmlGetProp。但是,當我看到您的評論(以及問題的標題)時,我認爲您可以使用相對xpath查詢,請參閱What's the most efficient way to do recursive XPath queries using libxml2?

+0

謝謝你的時間:) – user1374855

+0

xpath.evaluate(「// * [@ link ='true']/@ name」,xlink);然後我通過添加/../直到選定的名稱遞歸獲取父項。 xpath.evaluate(「// * [@ link ='true'] /../@name」,link);然後我追加值 – user1374855

+0

好的建議,我需要糾正答案的第二部分。我還添加了另一個通知。 – Jarekczek