XPath: получить только элементы с определенным подэлементом - PullRequest
4 голосов
/ 11 ноября 2011

У меня есть файловая система, которая представлена ​​в XML-документе в следующем формате:

<xml xmlns="namespace1" xmlns:ns2="namespace2">
  <entry>
    <id>123</id>
    <ns2:content name="type">directory</ns2:content>
    <ns2:content name="numErrors">3</ns2:content>
  </entry>
  ...
  <entry>
    <id>456</id>
    <ns2:content name="type">file</ns2:content>
    <ns2:content name="docState">success</ns2:content>
  </entry>
  ...
</xml>

Что мне нужно сделать, так это с помощью lxml Python получить только те объекты entry, которые представляют каталоги. Все записи содержат объект <ns2:content name="docState">, но мне нужно знать, как получить список entry объектов, где текст этого объекта равен directory. Я могу сделать это в несколько неудобных шагов, но я бы предпочел один запрос. Вот как я бы делал это по шагам:

#xml_parse.py

ns={'ns1':'namespace1','ns2':'namespace2'}
for node in tree.xpath("//ns1:entry",namespaces=ns):
    if node.find("ns2:content[@name='type']").text=="directory":
      #do stuff with node
      pass

Может кто-нибудь объяснить, как это сделать в операторе for вместо использования if?

Спасибо

1 Ответ

5 голосов
/ 11 ноября 2011

Используйте следующее выражение XPath:

//ns1:entry[ns2:content[@name='type' and .='directory']]
...