2016-05-10 3 views
1

У меня есть документ с этой структурой:Итерация над XML-документа

<?xml version="1.0" encoding="UTF-8"?> 
<entries> 
    <entry> 
    <term>word_1</term> 
    <opinion source="data1" polarity="0.10" /> 
    <opinion source="data2" polarity="0.4" /> 
    </entry> 
    <entry> 
    <term>word_2</term> 
    <opinion source="data1" polarity="1.0" /> 
    <opinion source="data2" polarity="-0.16666667" /> 
    <opinion source="data3" polarity="0.004" /> 
</entry> 
<entry> 
    <term>word_3</term> 
    <opinion source="data1" polarity="0.6" /> 
    <opinion source="data2" polarity="0.0" /> 
</entry> 
</entries> 

Я никогда не работал с xml раньше, и это доказывает, что боль. Я хочу извлечь слова, их полярность и источник. В идеале, исходя из этого примера, у меня было бы три словаря, названных в честь source (я точно знаю, что у него много разных источников, поэтому вручную назвать словари не проблема), которые будут содержать слова как key, а полярность - value, т.

data1 = {'word1':0.10, 'word2':1.0, 'word3':0.6} 
data2 = {'word1':0.4, 'word2':-0.16666667, 'word3':0.0} 
data3 = {'word2':0.004} 

Проблема в том, что я действительно не понимаю, как перебирать эту структуру. Я могу перебрать <term> так:

import xml.etree.ElementTree as ET 
tree = ET.parse('my.xml') 
root = tree.getroot() 

for term in root.iter('term'): 
    print term.text 


Out: 
word_1 
word_2 
word_3 

Но я не могу добраться до source и polarity пунктов. Любая помощь приветствуется. Благодарю.

+3

Этот файл является недопустимым XML согласно [этому механизму проверки XML] (http://www.xmlvalidation.com/index.php?id=1&L=0). Я также не мог разобрать его с помощью «ET». –

+0

@ gr1zzlybe4r Да, извините, я скопировал неправильный отрезанный. Я редактировал файл. Теперь он должен работать. – Zlo

+0

рад, что вы поняли это :) –

ответ

2

Посмотрите на это, я думаю, вы должны быть в состоянии следить за тем, как это работает.

import xml.etree.ElementTree as ET 

data = {} 
tree = ET.parse('test.xml') 
root = tree.getroot() 

for entry in root.iter('entry'): 
    term = entry.find('term') 
    for opinion in entry.iter('opinion'): 
     termDict = data.setdefault(opinion.get('source'), {}) 
     termDict[term.text] = opinion.get('polarity') 

for k,v in data.items(): 
    print k, v 
1

Вы хотите что-то вроде этого

import xml.etree.ElementTree 
e = xml.etree.ElementTree.parse('test.xml').getroot() 
for node in e.iter('entry'): #iterate over each entry node 
    for child in node: 
      print child.tag #get the name of the child 
      print child.attrib['polarity'], child.attrib['source'] #get the source and polarity 

но child.attrib поможет вам Dict атрибутов этого конкретного узла.

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