2015-10-26 3 views
1

У меня есть XML-файл:получение данных XML в Python

<uniprot created="2010-12-20"> 
<entry dataset="abc"> 
    <references id="1"> 
     <title>first references</title> 
     <author> 
      <person name="Mr. A"/> 
      <person name="Mr. B"/> 
      <person name="Mr. C"/> 
     </author> 
     <scope> scope 1 for id 1 </scope> 
     <scope> scope 2 for id 1 </scope> 
     <scope> scope 2 for id 1 </scope> 
    </references> 
    <references id="2"> 
     <title>Second references</title> 
     <author> 
      <person name="Mr. D"/> 
      <person name="Mr. E"/> 
      <person name="Mr. F"/> 
     </author> 
     <scope> scope 1 for id 2 </scope> 
     <scope> scope 2 for id 2 </scope> 
     <scope> scope 3 for id 2 </scope> 
    </references> 
    <references id="3"> 
     <title>third references</title> 
     <author> 
      <person name="Mr. G"/> 
      <person name="Mr. H"/> 
      <person name="Mr. I"/> 
     </author> 
     <scope> scope 1 for id 3 </scope> 
     <scope> scope 2 for id 3 </scope> 
     <scope> scope 3 for id 3 </scope> 
    </references> 
    <references id="4"> 
     <title>fourth references</title> 
     <author> 
      <person name="Mr. J"/> 
      <person name="Mr. K"/> 
      <person name="Mr. L"/> 
     </author> 
     <scope> scope 1 for id 4 </scope> 
     <scope> scope 2 for id 4 </scope> 
     <scope> scope 3 for id 4 </scope> 
    </references> 
    </entry> 
</uniprot> 

Я хочу все ссылки из этого XML в определенном формате: Выходные:

First Reference 
Mr A, Mr B, Mr C 
Scope 1 for id 1, Scope 2 for id 1, Scope 3 for id 1 

Second Reference 
Mr D, Mr E, Mr F 
Scope 1 for id 2, Scope 2 for id 2, Scope 3 for id 2 

Third Reference 
Mr G, Mr H, Mr I 
Scope 1 for id 3, Scope 2 for id 3, Scope 3 for id 3 

Fourth Reference 
Mr J, Mr K, Mr L 
Scope 1 for id 4, Scope 2 for id 4, Scope 3 for id 4 

Я написал свой код и Я могу получить значение заголовка в правильном формате, но я не могу получить информацию об авторе специально для каждой записи.

import xml.etree.ElementTree as ET 
document = ET.parse("recipe.xml") 
root = document.getroot() 
title=[] 
author=[] 
scope=[] 

for i in root.getiterator('title'): 
    title.append(i.text) 
    for j in root.getiterator('author'): 
      author.append(j.text) 
      for k in root.getiterator('scope'): 
       scope.append(k.text) 

for i,j,k in zip(title,author,scope): 
     print i,j,k 

ответ

0

Поскольку имена авторов хранятся в name атрибуте person тегов, а также давайте использовать Dict для хранения каждого reference данных, например:

references = [] 
for i in root.getiterator('title'): 
    reference = { 
     'title': i.text, 
     'authors': [], 
     'scopes': [],  
    } 

    for j in root.getiterator('author'): 
     for person in root.getiterator('person'): 
      reference['authors'].append(person.get('name')) 

     for k in root.getiterator('scope'): 
      reference['scopes'].append(k.text) 

В конце концов вы будете иметь список dicts как это:

[ 
    { 
     'title': 'Something', 
     'authors': [ 
      'Author 1', 
      'Author 2', 
     ], 
     'scopes': [ 
      'scope 1', 
      'scope 2', 
     ] 
    } 
] 
+0

Еще только название печати, так как имена для каждого названия становится сохранены в списке автора, и для следующего названия, как он будет добавлять в список по-разному? –

+0

О, я не обращал внимания на остальную часть кода, теперь я редактирую свой ответ. – MostafaR

0

Использование LXML и XPath для этого:

import lxml 
from lxml.etree import fromstring,tostring 
# x has the xml 
x = fromstring(x) 

def print_references(ref_node): 
    authors = " ".join([t for t in ref_node.xpath('author/person/@name')]) 
    scope = ", ".join([t.text for t in ref_node.xpath('scope')]) 
    ref = next(iter(ref_node.xpath('@id')),None) 
    print "{} Reference\n{}\n{}\n".format(ref, authors, scope.lstrip()) 

references = x.xpath('//references') 
for ref in references: 
    print_references(ref) 

Выход:

1 Reference 
Mr. A Mr. B Mr. C 
scope 1 for id 1 , scope 2 for id 1 , scope 2 for id 1 

2 Reference 
Mr. D Mr. E Mr. F 
scope 1 for id 2 , scope 2 for id 2 , scope 3 for id 2 

3 Reference 
Mr. G Mr. H Mr. I 
scope 1 for id 3 , scope 2 for id 3 , scope 3 for id 3 

4 Reference 
Mr. J Mr. K Mr. L 
scope 1 for id 4 , scope 2 for id 4 , scope 3 for id 4 
+0

Я утверждаю, что, но я хочу, чтобы это использовало только XML, и что, если у меня много записей, вы упомянули об этом всего за четыре записи. –

+0

и его ошибка бросания..показание, что ни один модуль, такой как lxml –

+0

Yep, LXML не является встроенным модулем. Новое редактирование удалило жесткую кодировку порядковых номеров. – salparadise

Смежные вопросы