Forum Webscript.Ru
Программирование => Perl => Тема начата: 2NetFly от 30 Января 2005, 14:26:58
-
Существует объемный XML документ (1-5 мегабайт) следующего формата:
...
...
...
...
Необходимо получить заданную ноду и преобразовать ее при помощи XML::Simple в структуру. Порылся в модулях – многие позволяют делать поиск по документу, но предварительно производят парсинг всего документа, а именно этого я пытаюсь избежать. В принципе, конкретно эту проблему можно решить подручными средствами, но хотелось бы найти готовое решение. Что посоветуете?
-
Если Вы хотите работать с документом как с XML, то без парсинга не обойтись, поэтому врядли найдете готовое решение. Так что пишите свой парсер и работайте с XML как с TXT, не проверяя на валидность, правда в таком случае встает вопрос - а может тогда лучше уйти в сторону БД?
-
vladsu, ты хоть сам понял, что сказал?:)
2NetFly, воспользуйся любым модулем, который не читает всё дерево сразу в память. Не понял в чём проблема? Поиск осуществляешь последовательно перебирая ноды...
-
glebushka:
воспользуйся любым модулем, который не читает всё дерево сразу в память.
Если внимательно прочитать мое первое сообщение можно заметить, что именно готовый модуль я и ищу ;=)
-
2NetFly, как тебе мало для счастья надо:) Вышеописанный поиск реализуется несколькими строчками кода. ИМХО, врятли кто-нибудь стал бы выделять их в отдельную функцию модуля и выкладывать на CPAN.
-
2NetFly
парсеры, которые не читают весь XML в память называются SAX-парсерами.
Наиболее известный такой freeware-парсер - Expat.
Вроде в perl есть XML-SAX-Expat
-
SAX – это, конечно, хорошо, но для данной задачи написание обработчиков - это слишком. Судя по всему, собственная реализация в данном случае будем оптимальной: построчная проверка и прекращение чтения файла после нахождения нужного фрагмента.
Спасибо всем за внимание.
-
glebushka:
vladsu, ты хоть сам понял, что сказал?
Конечно, а Вы видимо - нет. Вас наверное смутила фраза "работайте с XML как с TXT", действительно глупость сморозил, но я имел ввиду работать построчно.