2012-04-06 3 views
3

У меня есть файл XMLИтеративно разбора большого файла XML без использования DOM подход

<temp> 
    <email id="1" Body="abc"/> 
    <email id="2" Body="fre"/> 
    . 
    . 
    <email id="998349883487454359203" Body="hi"/> 
</temp> 

Я хочу, чтобы прочитать файл XML для каждого адреса электронной метки. То есть, в то же время я хочу прочитать электронное письмо id = 1..extract body из него, прочитанный email id = 2 ... и извлечь из него тело ... и т. Д.

Я попытался сделать это используя модель DOM для синтаксического анализа XML, так как размер моего файла равен 100 ГБ. Подход не работает. Затем я попытался с помощью:

from xml.etree import ElementTree as ET 
    tree=ET.parse('myfile.xml') 
    root=ET.parse('myfile.xml').getroot() 
    for i in root.findall('email/'): 
       print i.get('Body') 

Теперь, как только я получаю root..I я не получаю, почему мой код не смог разобрать.

код при использовании iterparse бросает следующее сообщение об ошибке:

"UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 437: ordinal not in range(128)" 

Может кто-нибудь помочь

+0

Вы пробовали синтаксический анализ SAX? – Marcin

+0

Я пробовал, но, учитывая размер моего файла, мне предложили использовать 'lxml', также я не получаю точно, как использовать iterparse. Кроме того, спасибо тонну за ответ. :) –

+0

Вы пробовали 'xml.etree.ElementTree.iterparse()'? – Dikei

ответ

8

пример для iterparse:

import cStringIO 
from xml.etree.ElementTree import iterparse 

fakefile = cStringIO.StringIO("""<temp> 
    <email id="1" Body="abc"/> 
    <email id="2" Body="fre"/> 
    <email id="998349883487454359203" Body="hi"/> 
</temp> 
""") 
for _, elem in iterparse(fakefile): 
    if elem.tag == 'email': 
     print elem.attrib['id'], elem.attrib['Body'] 
    elem.clear() 

Просто замените fakefile с реальным файлом. Также читайте this для получения дополнительной информации.

+0

Вы забыли сказать, откуда должен был прибыть «итерапевт». –

+0

Я добавляю импорт – Dikei

+0

+1, но для файла в 100 ГБ я бы использовал LXML-версию 'iterparse'. –

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