2013-07-15 4 views
2

Вот пример из док Я работаю с:XPath - возвращает все узлы с определенным рисунком строки

<idx:index xsi:schemaLocation="http://www.belscript.org/schema/index index.xsd" idx:belframework_version="2.0"> 
    <idx:namespaces> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/entrez-gene-ids-hmr.belns"/> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/hgnc-approved-symbols.belns"/> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/mgi-approved-symbols.belns"/> 

я могу получить все узлы с именем «пространства имен» со следующим кодом:

tree = etree.parse(self.old_files) 
urls = tree.xpath('//*[local-name()="namespace"]') 

Это вернет список элементов 3 namespace. Но что, если я хочу получить данные в атрибуте idx:resourceLocation? Вот моя попытка сделать это, используя XPath docs в качестве руководства.

urls = tree.xpath('//*[local-name()="namespace"]/@idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/"', 
          namespaces={'idx' : 'http://www.belscript.org/schema/index'}) 

То, что я хочу, это все узлы, которые имеют атрибут, начиная с http://resource.belframework.org/belframework/1.0/namespace. Поэтому в образце doc он возвращает мне только те строки в атрибуте resourceLocation. К сожалению, синтаксис не совсем прав, и у меня возникают проблемы с получением правильного синтаксиса из документации. Спасибо!

ответ

2

Я думаю, что вы ищете:

//*[local-name()="namespace"]/@idx:resourceLocation 

или

//idx:namespace/@idx:resourceLocation 

или, если вы хотите только те @idx:resourceLocation атрибуты, которые начинаются с "http://resource.belframework.org/belframework/1.0/namespace" вы могли бы использовать

'''//idx:namespace[ 
     starts-with(@idx:resourceLocation, 
     "http://resource.belframework.org/belframework/1.0/namespace")] 
      /@idx:resourceLocation''' 

import lxml.etree as ET 

content = '''\ 
<root xmlns:xsi="http://www.xxx.com/zzz/yyy" xmlns:idx="http://www.belscript.org/schema/index"> 
<idx:index xsi:schemaLocation="http://www.belscript.org/schema/index index.xsd" idx:belframework_version="2.0"> 
    <idx:namespaces> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/entrez-gene-ids-hmr.belns"/> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/hgnc-approved-symbols.belns"/> 
     <idx:namespace idx:resourceLocation="http://resource.belframework.org/belframework/1.0/namespace/mgi-approved-symbols.belns"/> 
     </idx:namespaces> 
     </idx:index> 
     </root> 
     ''' 

root = ET.XML(content) 
namespaces = {'xsi': 'http://www.xxx.com/zzz/yyy', 
       'idx': 'http://www.belscript.org/schema/index'} 
for item in root.xpath(
    '//*[local-name()="namespace"]/@idx:resourceLocation', namespaces=namespaces): 
    print(item) 

дает

http://resource.belframework.org/belframework/1.0/namespace/entrez-gene-ids-hmr.belns 
http://resource.belframework.org/belframework/1.0/namespace/hgnc-approved-symbols.belns 
http://resource.belframework.org/belframework/1.0/namespace/mgi-approved-symbols.belns 
+0

Да! Большое спасибо, именно то, что я искал. – Houdini