2016-09-25 38 views
1

背景我試圖使用libkeepass python庫從keepass2文件讀取密碼。使用lxml在xml中進行復雜搜索

使用lxml(beause這就是libkeepass給我),我必須尋找這樣一個條目,並從中取密碼值

<Entry> 
<String> 
    <Key>Password</Key> 
    <Value Protected="False" ProtectedValue="XXX">XXX</Value> 
</String> 
<String> 
    <Key>Title</Key> 
    <Value>PasswordName</Value> 
</Entry> 

所以我必須找到一個條目:

  • 與孩子「字符串」
    • 的小孩「重點」與價值「標題」
    • 與孩子「價值」與價值「PasswordName」
  • 的小孩「字符串」
    • 的小孩「重點」與價值「密碼」
    • 的小孩「價值」 - >和孩子的價值是什麼,我需要

我已經走到這一步(KDB beeing密碼文件對象):

kdb.obj_root.findall(".//Entry/String[Key='Title'][Value='PasswordName']") 

這給了我正確條目的字符串元素。

回答

1

或者,而不是去到String,回升至Entry,然後再下到另一String,你可以只使用Entry元素謂語,然後從那裏返回目標String元素。

由於您使用的是lxml,我還建議使用xpath()而不是findall()。前者提供對XPath 1.0表達式的全面支持,而後者僅支持subset of XPath 1.0

query = """ 
     .//Entry[String[Key='Title' and Value='MyPassword']] 
     /String[Key='Password'] 
     /Value 
     """ 
kdb.obj_root.xpath(query) 
+0

哦,這就是你如何嵌套謂詞。謝謝! – Nathan

1

我剛剛意識到,我可以使用「..」導航。因此,解決辦法是:

kdb.obj_root.findall(".//Entry/String[Key='Title'][Value='MyPassword']/../String[Key='Password']/Value")