2016-03-25 4 views
1

、私はいくつかのタグの値を取得しようとするには、このリンクを次のようだ:このリンクでAccesing値2.7 lxmlの

Parsing XML with namespace in Python via 'ElementTree'

ルートにアクセスするには、問題はありません

import sys 
from lxml import etree as ET 


doc = ET.parse('file.xml') 

namespaces_rdf = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'} # add more as needed 
namespaces_dcat = {'dcat': 'http://www.w3.org/ns/dcat#'} # add more as needed 
namespaces_dct = {'dct': 'http://purl.org/dc/terms/'} 

print doc.findall('rdf:RDF', namespaces_rdf) 
print doc.findall('dcat:Dataset', namespaces_dcat) 
print doc.findall('dct:identifier', namespaces_dct) 

OUTPUT:このようなタグ

[] 
[<Element {http://www.w3.org/ns/dcat#}Dataset at 0x2269b98>] 
[] 

私は唯一のアクセスもを取得しますDCAT秒:データセット、と私はRDFの値にアクセスする方法を見ることができない約

とDCTに後でアクセス:識別子もちろん

、私はこの情報にアクセスした後は、私がする必要がありDCATへのアクセスも:配布先

これはckanext-DCATで生成された私のサンプルファイル、次のとおりです。

<?xml version="1.0" encoding="utf-8"?> 
<rdf:RDF 
    xmlns:dct="http://purl.org/dc/terms/" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:dcat="http://www.w3.org/ns/dcat#" 
> 
    <dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01"> 
    <dct:identifier>ec631628-2f46-4f17-a685-d62a37466c01</dct:identifier> 
    <dct:description>FOO-Description</dct:description> 
    <dct:title>FOO-title</dct:title> 
    <dcat:keyword>keyword1</dcat:keyword> 
    <dcat:keyword>keyword2</dcat:keyword> 
    <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-10-08T08:55:04.566618</dct:issued> 
    <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2015-06-25T11:04:10.328902</dct:modified> 
    <dcat:distribution> 
     <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f"> 
     <dct:title>FOO-title-1</dct:title> 
     <dct:description>FOO-Description-1</dct:description> 
     <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f/download/myxls.xls</dcat:accessURL> 
     <dct:format>XLS</dct:format> 
     </dcat:Distribution> 
    </dcat:distribution> 
    <dcat:distribution> 
     <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f"> 
     <dct:format>XLS</dct:format> 
     <dct:title>FOO-title-2</dct:title> 
     <dct:description>FOO-Description-2</dct:description> 
     <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f/download/myxls.xls</dcat:accessURL> 
     </dcat:Distribution> 
    </dcat:distribution> 
    </dcat:Dataset> 
</rdf:RDF> 

この情報にアクセスする方法上の任意のアイデア? おかげ

UPDATE: まあ、私はRDFにアクセスする必要がありますについて中:私は取得

Parse xml with lxml - extract element value

for node in doc.xpath('//dcat:Dataset', namespaces=namespaces): 
    # Iterate over attributes 
    for attrib in node.attrib: 
      print '@' + attrib + '=' + node.attrib[attrib] 

:このコードのように

<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01"> 

から撮影この出力:

[<Element {http://www.w3.org/ns/dcat#}Dataset at 0x23d8ee0>] 
@{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about=http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01 

だから、質問は次のとおりです。

属性がについて他のファイルで、私はいくつかのタグを持っているので、この値を取ることであれば、私は尋ねることができますどのように。

UPDATE 2:私は価値について取得する方法を修正(クラーク表記)

for node in doc.xpath('//dcat:Dataset', namespaces=namespaces): 
    # Iterate over attributes 
    for attrib in node.attrib: 
     if attrib.endswith('about'): 
     #do my jobs 

まあ、ほとんど完成し、私は最後の質問を持っている:私は私の

<dct:title>にアクセスするときに知っておく必要があります所属する

、私が持っている:

<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01"> 
     <dct:title>FOO-title</dct:title> 

<dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f"> 
     <dct:title>FOO-title-1</dct:title> 

<dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f"> 
     <dct:title>FOO-title-2</dct:title> 

私はこのような何かをすれば、私が取得:

for node in doc.xpath('//dct:title', namespaces=namespaces): 
    print node.tag, node.text 

{http://purl.org/dc/terms/}title FOO-title 
{http://purl.org/dc/terms/}title FOO-title-1 
{http://purl.org/dc/terms/}title FOO-title-2 

おかげ

答えて

1

namespaces名前付き引数とxpath()メソッドを使用します。

namespaces = { 
    'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 
    'dcat': 'http://www.w3.org/ns/dcat#', 
    'dct': 'http://purl.org/dc/terms/' 
} 

print(doc.xpath('//rdf:RDF', namespaces=namespaces)) 
print(doc.xpath('//dcat:Dataset', namespaces=namespaces)) 
print(doc.xpath('//dct:identifier', namespaces=namespaces)) 
+0

まあ、グレート!!!、魔法のように動作します私はxpathを知らなかったので、私はそれを理解する時間がかかります。ありがとう – davisoski

+0

@davisoski、http://stackoverflow.com/help/someone-answersを参照してください。あなたの以前の答えを見て、受け入れられるべき答えがあるかどうかを見てください。 – alecxe