2016-09-25 2 views
1

Фон Я пытаюсь прочитать пароль из файла keepass2, используя libkeepass библиотеку python.Комплексный поиск в xml с использованием lxml

Использование lxml (Beause это то, что libkeepass дает мне) я должен искать записи, как это и принять значение пароля от него

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

Так что я должен найти запись:

  • с ребенком "String"
    • с ребенком "Key" со значением "Title"
    • с ребенком "Value" со значением "PasswordName"
  • с ребенком "String"
    • с ребенком "Key" со значением "Пароль"
    • с ребенком "Value" - > и значение этого ребенка, что мне нужно

я уже получил это далеко (БРК неоспоримым объект файла паролей):

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

Это дает мне строковый элемент правильной записи.

ответ

1

В качестве альтернативы, вместо того, чтобы идти вниз к String, обратно до Entry, а затем снова к другим String, вы можете просто использовать предикат Entry элемента, а затем вернуться в цели String элемента оттуда ,

Поскольку вы используете lxml, я также предлагаю использовать метод xpath() вместо findall(). Первый обеспечивает полную поддержку 1.0 выражения XPath, в то время как последний поддерживает только subset of XPath 1.0:

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

О, как вы Nest предикаты. Благодаря! – Nathan

1

Я только что понял, я могу перемещаться, используя «..». Таким образом, решение:

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

 Смежные вопросы

  • Нет связанных вопросов^_^