Найти - Пользователи
Полная версия: SAX:Парсинг с конца файла
Начало » Python для экспертов » SAX:Парсинг с конца файла
1
michails
Задача следующая: есть большой(сотни мб.) xml-файл (если конкретнее формат .osm ). Требуется отфильтровать и результат записать в файл. Проблема заключается в том, что результат фильтрации последующих элементов зависит от предыдущих(см. Подробности). Простым решением могло быть чтение с конца, однако нигде не описанА такая манипуляция с открытием файла или c sax-парсером (предварительное создание копии файла не в счет)

Подробности.
Основными элементами в формате .osm явлются node,way,relation. При этом way содержит ссылки на node, a relation - ссылки на node и way:
<osm>
<node id='1'/>
<node id='2'/>
<way id='1'>
<!--Ссылки на элементы -->
<nd ref='1'/>
<nd ref='2'/>
</way>
<relation id='1'>
<!--Ссылки на элементы -->
<member type='node' ref='1'/>
<member type='way' ref='1'/>
</relation>
</osm>
Требуется отфильтровать:
1.Элементы,удовлетворяющие условию фильтрации
2.элементы, на которые ссылаются элементы пункта 1
michails
К сожалению трюк с чтением с конца не прошёл. Стандартный xml.sax.ContentHandler выдаёт ошибку, встречая закрытый тег перед отрытым. Честно говоря совсем не понятно подобное поведение - это особенность конкретной реализации или подобное ограничение чем-то обусловлено?
Андрей Светлов
С конца парсить нельзя. SAX работает только с прямым потоком — по построению.
michails
Проблему в итоге решил радикально - написал парсер под этот формат. Странно, что для подобной задачи не имеется готового решения.
PooH
michails
Проблему в итоге решил радикально - написал парсер под этот формат. Странно, что для подобной задачи не имеется готового решения.
Я посмотрел описание и схему формата osm и не нашел чтобы там гарантировался порядок появления node, way и relation.
michails
Вообще я также этого не видел, но все генераторы, в том числе c официальных серверов openstreetmap, выдают именно такую последовательность. Также возможно (не берусь утверждать точно), такая последовательность необходима, чтобы корректно импортировать эти данные в postgre(это распространённая задача).
Поэтому мне кажется, что это стандарт де-факто.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB