Форум сайта python.su
Задача следующая: есть большой(сотни мб.) 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>
Офлайн
К сожалению трюк с чтением с конца не прошёл. Стандартный xml.sax.ContentHandler выдаёт ошибку, встречая закрытый тег перед отрытым. Честно говоря совсем не понятно подобное поведение - это особенность конкретной реализации или подобное ограничение чем-то обусловлено?
Офлайн
С конца парсить нельзя. SAX работает только с прямым потоком — по построению.
Офлайн
Проблему в итоге решил радикально - написал парсер под этот формат. Странно, что для подобной задачи не имеется готового решения.
Офлайн
michailsЯ посмотрел описание и схему формата osm и не нашел чтобы там гарантировался порядок появления node, way и relation.
Проблему в итоге решил радикально - написал парсер под этот формат. Странно, что для подобной задачи не имеется готового решения.
Офлайн
Вообще я также этого не видел, но все генераторы, в том числе c официальных серверов openstreetmap, выдают именно такую последовательность. Также возможно (не берусь утверждать точно), такая последовательность необходима, чтобы корректно импортировать эти данные в postgre(это распространённая задача).
Поэтому мне кажется, что это стандарт де-факто.
Офлайн