2013-05-16 7 views
1

Я только начал изучать, как анализировать xml, используя minidom. Я пытался получить имена автора (XML-данных снижается ниже), используя следующий код:Python xml parsing using minidom

from xml.dom import minidom 

xmldoc = minidom.parse("cora.xml") 

author = xmldoc.getElementsByTagName ('author') 

for author in author: 
    authorID=author.getElementsByTagName('author id') 
    print authorID 

я получил пустые скобки ([]) весь путь. Может кто-нибудь, пожалуйста, помогите мне? Мне также понадобится название и место проведения. Заранее спасибо. См данных XML ниже:

<?xml version="1.0" encoding="UTF-8"?> 
<coraRADD> 
    <publication id="ahlskog1994a"> 
     <author id="199">M. Ahlskog</author> 
     <author id="74"> J. Paloheimo</author> 
     <author id="64"> H. Stubb</author> 
     <author id="103"> P. Dyreklev</author> 
     <author id="54"> M. Fahlman</author> 
     <title>Inganas</title> 
     <title>and</title> 
     <title>M.R.</title> 
     <venue> 
     <venue pubid="ahlskog1994a" id="1"> 
        <name>Andersson</name> 
        <name> J Appl. Phys.</name> 
        <vol>76</vol> 
        <date> (1994). </date> 
      </venue> 
+0

является то, что правильные данные в XML? Существует дополнительное открытие '' тега, а теги '' и '' не закрыты. –

+0

Привет, Пол, это правильные данные XML. Я скопировал его непосредственно из файла XML. – user2274879

+0

Вы женаты в мини-библиотеке? Например, API ElementTree гораздо проще использовать. –

ответ

1

Вы можете найти только тег с getElementsByTagName(), а не атрибутами. Вам необходимо получить доступ к этим через Element.getAttribute() method вместо:

for author in author: 
    authorID = author.getAttribute('id') 
    print authorID 

Если вы все еще узнать о разборе XML, вы действительно хотите, чтобы держаться подальше от DOM. API DOM слишком многословен, чтобы соответствовать многим языкам программирования.

ElementTree API будет проще в использовании:

import xml.etree.ElementTree as ET 

tree = ET.parse('cora.xml') 
root = tree.getroot() 

# loop over all publications 
for pub in root.findall('publication'): 
    print ' '.join([t.text for t in pub.findall('title')]) 
    for author in pub.findall('author'): 
     print 'Author id: {}'.format(author.attrib['id']) 
     print 'Author name: {}'.format(author.text) 
    for venue in pub.findall('.//venue[@id]'): # all venue tags with id attribute 
     print ', '.join([name.text for name in venue.findall('name')]) 
+0

Hi Pieters, теперь он работает. Большое спасибо, но меня больше интересуют имена авторов и место проведения. Есть идеи? – user2274879

+0

@ user2274879: Вместо этого создайте петлю над публикациями ('for pub in root.findall ('публикация'):'), затем найдите авторов ('для автора в pub.findall ('author')') и места (' для места в pub.findall ('.// ​​venue [@id]') 'возможно, чтобы найти только те, у которых есть атрибут id. Имена авторов - это текстовое содержимое в теге, поэтому 'author.text' вам это поможет. –

+0

У меня возникла следующая ошибка, когда я попытался использовать author.tex: TypeError: объект 'str' не может быть вызван – user2274879

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