2

これは、私が使用しているドキュメントのサンプルです。

<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"/>

次のコードを使用して、「namespace」という名前のすべてのノードを取得できます。

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

namespaceこれは、3 つの要素のリストを返します。idx:resourceLocationしかし、属性内のデータにアクセスしたい場合はどうすればよいでしょうか? これは、 XPath ドキュメントをガイドとして使用して、それを行うための私の試みです。

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。したがって、サンプル ドキュメントでは、resourceLocation属性内の文字列のみが返されます。残念ながら、構文が正しくないため、ドキュメントから適切な構文を導き出すのに苦労しています。ありがとうございました!

4

1 に答える 1

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
于 2013-07-15T22:02:59.310 に答える