Как найти определенный тег в файле XML, а затем получить доступ к его родительскому тегу с помощью Python и minidom - PullRequest
0 голосов
/ 10 февраля 2011

Я пытаюсь написать некоторый код, который будет искать в XML-файле статей конкретный DOI, содержащийся в теге. Когда он найдет правильный DOI, я бы хотел получить доступ к тексту <title> и <abstract> для статьи, связанной с этим DOI.

Мой 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 (например), а затем я смог бы получить доступ к <title> и <abstract> теги внутри соответствующего тега <article>.

До сих пор я пытался адаптировать код из этого вопроса :

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

Но я не совсем уверен, что я делаю!

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Требуется ли минидом? Было бы довольно легко разобрать его с помощью 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 или нет. Вероятно, поэтому вы не можете сопоставить его с минидомом.

0 голосов
/ 10 февраля 2011

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")
...