2011-02-10 21 views
0

タグ内に含まれる特定のDOIの記事のXMLファイルを検索するコードを記述しようとしています。正しいDOIを見つけたら、そのDOIに関連する記事の<title><abstract>のテキストにアクセスします。XMLファイル内の特定のタグを見つけてPythonとミニドームでその親タグにアクセスする方法

私のXMLファイルは、この形式である:

<root> 
<article> 
    <number> 
    0 
    </number> 
    <DOI> 
    10.1016/B978-0-12-381015-1.00004-6 
    </DOI> 
    <title> 
    The patagonian toothfish biology, ecology and fishery. 
    </title> 
    <abstract> 
    lots of abstract text 
    </abstract> 
</article> 
<article> 
    ...All the article tags as shown above... 
</article> 
</root> 

私は(例えば)DOI 10.1016/B978-0-12-381015-1.00004-6との記事を見つけるために、スクリプトを希望し、私には、対応する<article>タグ内の<title><abstract>タグにアクセスできるようになりました。

from xml.dom import minidom 

datasource = open('/Users/philgw/Dropbox/PW-Honours-Project/Code/processed.xml') 
xmldoc = minidom.parse(datasource) 

#looking for: 10.1016/B978-0-12-381015-1.00004-6 

matchingNodes = [node for node in xmldoc.getElementsByTagName("DOI") if node.firstChild.nodeValue == '10.1016/B978-0-12-381015-1.00004-6'] 

for i in range(len(matchingNodes)): 
    DOI = str(matchingNodes[i]) 
    print DOI 

しかし、私は私がやっている全くわからない:

は、これまでのところ私はthis questionからコードを適応しようとしました!

ありがとうございました。

答えて

0

imho - ただpythonのドキュメントでそれを見てください! これを試してみてください(テストしていません):

from xml.dom import minidom 

xmldoc = minidom.parse(datasource) 

def get_xmltext(parent, subnode_name): 
    node = parent.getElementsByTagName(subnode_name)[0] 
    return "".join([ch.toxml() for ch in node.childNodes]) 

matchingNodes = [node for node in xmldoc.getElementsByTagName("article") 
      if get_xmltext(node, "DOI") == '10.1016/B978-0-12-381015-1.00004-6'] 

for node in matchingNodes: 
    print "title:", get_xmltext(node, "title") 
    print "abstract:", get_xmltext(node, "abstract") 
+0

は、私は今それを参照してください[OK]、[OK]をその今更新...私はそれを更新し、matchingNodesで最初の親を探す必要があります。 – Jiri

+0

ありがとうございましたJiri - これは有望ですが、現時点では私が試して試してみると出力が返ってこないのです。あなたの例にデータソース行を追加しましたが、何も印刷されていません。 – Phil

+0

スクリプトを混乱させる空白に問題がありましたが、これは素晴らしいことです。ありがとうございます。 – Phil

1

minidomは必須ですか? lxmlとXPathで解析するのは簡単です。

from lxml import etree 
datasource = open('/Users/philgw/Dropbox/PW-Honours-Project/Code/processed.xml').read() 
tree = etree.fromstring(datasource) 
path = tree.xpath("//article[DOI="10.1016/B978-0-12-381015-1.00004-6") 

これにより、DOIが指定された記事が表示されます。

また、タグ間に空白があるようです。これがStackoverflowの書式設定のためかどうかわからない。これはたぶんあなたがminidomと一致させることができない理由です。

関連する問題