2011-02-10 4 views
0

태그에 포함 된 특정 DOI에 대한 기사의 XML 파일을 검색하는 코드를 작성하려고합니다. 올바른 DOI를 찾았 으면 DOI와 관련된 기사의 <title><abstract> 텍스트에 액세스하고 싶습니다. 나는 DOI 10.1016/B978-0-12-381015-1.00004-6 (예를 들어)와 함께 기사를 찾을 수있는 스크립트를 싶습니다XML 파일에서 특정 태그를 찾은 다음 Python과 minidom을 사용하여 상위 태그에 액세스하는 방법

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

:

내 XML 파일은 다음 형식으로되어 있습니다 그러면 해당 <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 - 파이썬 워드 프로세서에서보세요! 이 시도 (테스트하지) :

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

내가 지금보고 좋아, 당신은 확인의 지금 업데이트 ... 나는 그것을 업데이트는 matchingNodes에서 첫 번째 부모를 조회 할 필요가있다. – Jiri

+0

감사합니다 Jiri - 이것은 유망 해 보입니다 만, 현재 시도하고 테스트 할 때 출력이 반환되지 않습니다. 귀하의 예제에 데이터 소스 라인을 추가했지만 아무것도 인쇄되지 않습니다. – Phil

+0

스크립트를 혼란스럽게하는 공백 문제가있었습니다. – Phil

1

최소 요구 사항은 무엇입니까? 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과 일치시킬 수없는 이유 일 것입니다.

관련 문제