Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2010 15:29:58

cal-lek
От:
Зарегистрирован: 2010-09-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

Доброго времени суток всем питоновцам!

Возникла задача загрузки данных из XML очень большого размера (файл порядка 60 Мб и 1,5 млн. строк). Структура примерно такая:

<?xml version="1.0" encoding="Windows-1251" ?>
<Файлик>
<ИмяФайла>01247.XML</ИмяФайла>
<ЗаголовокФайла>
<ВерсияФормата>07.00</ВерсияФормата>
<ТипФайла>ВНЕШНИЙ</ТипФайла>
</ЗаголовокФайла>
<ОПИСЬ>
<СоставДокументов>
<Количество>1</Количество>
<НаличиеДокументов>
<ТипДокумента>Документики</ТипДокумента>
<Количество>4</Количество>
</НаличиеДокументов>
</СоставДокументов>
<ДатаСоставления>27.07.2010</ДатаСоставления>
<Организация>
<НаименованиеОрганизации>Какое-то название</НаименованиеОрганизации>
</Организация>
</ОПИСЬ>
<СОДЕРЖАНИЕ_ДОКУМЕНТА>
<ФИО>
<Фамилия>ИВАНОВ</Фамилия>
<Имя>ИВАН</Имя>
<Отчество>ИВАНОВИЧ</Отчество>
</ФИО>
<ДатаРождения>27.07.2010</ДатаРождения>
</СОДЕРЖАНИЕ_ДОКУМЕНТА>

<СОДЕРЖАНИЕ_ДОКУМЕНТА>
<ФИО>
<Фамилия>ИВАНОВ</Фамилия>
<Имя>ИВАН</Имя>
<Отчество>ИВАНОВИЧ</Отчество>
</ФИО>
<ДатаРождения>27.07.2010</ДатаРождения>
</СОДЕРЖАНИЕ_ДОКУМЕНТА>

<СОДЕРЖАНИЕ_ДОКУМЕНТА>
<ФИО>
<Фамилия>ИВАНОВ</Фамилия>
<Имя>ИВАН</Имя>
<Отчество>ИВАНОВИЧ</Отчество>
</ФИО>
<ДатаРождения>27.07.2010</ДатаРождения>
</СОДЕРЖАНИЕ_ДОКУМЕНТА>
</Файлик>
Разбор через minidom не подходит, а через sax-интерфейс не удалось найти полноценного примера для разбора такой структуры (с питоном только начинаю дружить). Возможно ли разобрать сей документ и намертво не вешать систему при этом?



Офлайн

#2 Сен. 6, 2010 15:51:25

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

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



Офлайн

#3 Сен. 6, 2010 16:03:46

cal-lek
От:
Зарегистрирован: 2010-09-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

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



Офлайн

#4 Сен. 6, 2010 16:23:16

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

Большие файлы конечно нужно парсить потоком через SAX. Изучайте его.



Офлайн

#5 Сен. 6, 2010 16:26:06

AlexAV
От:
Зарегистрирован: 2010-08-10
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

Если нужно разбираться с SAX, то наверное можно глянуть книгу “Python & XML” авторов Christopher A. Jones Fred L. Drake, Jr. издательства O'Reilly



Офлайн

#6 Сен. 6, 2010 16:31:07

cal-lek
От:
Зарегистрирован: 2010-09-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

Daevaorn
Большие файлы конечно нужно парсить потоком через SAX. Изучайте его.
При парсинге возникла проблема, когда переопределяются методы startElement() endElement() не нашел как получить значение тегов XML, т.е. например:
<Количество>1</Количество>
в обработчике события startElement(name, attrs) в переменной name находится тег “Количество”, а вот как получить значение “1”? словарь attrs все время пустой.

Хотелось бы увидеть простенький пример кода, где реализован весь принцип обработки XML



Офлайн

#7 Сен. 6, 2010 17:27:08

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Парсинг очень огромных ХML файлов

cal-lek
а вот как получить значение “1”
Это значение не является атрибутом тега - это есть подэлемент, только сущность его не ТЕГ, а ТЕКСТ.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version