![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
yodgik1 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 21.6.2007 Репутация: нет Всего: нет |
подскажите как мне вытащить из xml такого вида
всё начиная с <soap:aa> и заканчивая </soap:aa> спасибо. |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
yodgik1, вообще-то много очень обсуждалось про XML. Вы бы сначала поиском воспользовались!
Вам для этого модуль не нужен, но во многих это желательно.
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый yodgik1, попробуйте
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
yodgik1, я привел пример между
Добавлено через 8 секунд <soap:aa> ... </soap:aa> Добавлено через 38 секунд Возможно ginnie более прав, если Добавлено через 1 минуту и 40 секунд Т.к. я не понимаю если это весь XML, то зачем из него его же и получать ;) Добавлено через 4 минуты и 40 секунд yodgik1, ответьте, не мучайте ;) |
|||
|
||||
tolkien |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
Немного офтопа. <soap:aa>.+?</soap:aa> Меня такие конструкции страшно забавляют. Они всегда исправно работают или нет? В данном шаблоне получается PERL должен угадать, что вам надо. А это значит он может ошибиться и не угадать. |
||||
|
|||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
не, не всегда.
они срабатыват пока не поменяется префикс пространства имен в XML. Например ваш XML может выглядеть так:
soap -> zoap и быть при этом валидным XML. Используйте [code=use XML::LibXML; my $parser = XML::LibXML->new(); my $doc = $parser->parse_string($xml); my $xpc = XML::LibXML::XPathContext->new($doc->documentElement()); $xpc->registerNs('prefix', 'http://schemas.xmlsoap.org/soap/envelope/'); my $value = eval {$xpc->find('//prefix:aa')->textContent()}; [/code] вообще парсить xml и html regexами- зло.. |
|||
|
||||
Bulat |
|
||||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Отнюдь. Такие изменения могут быть вообще в любом файле. Сегодня парсишь один файл логов, с парой, где
А завтра станет
И что теперь?? Вообще использование регулярных выражений зло?? ![]() -------------------- менеджер по кодеврайтингу ![]() |
||||
|
|||||
sir_nuf_nuf |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
1) Это не надежное решение. Плохой стиль. 2) XPath намного удобней regex при работе с XML. 3) Вот как вы проверяете работу regex ? Да просто берет и проверяете на 1 XML. В результате вы можете быть уверены, что ваш regex работает на 1 xml. Завтра может прийти другой, на котором не работает. Например банально пробелов добавили (которые убираются нормализацией XML), поменяли префиксы, или в какой-то тэг добавили атрибут, а вы его раньше искали как /<bla>/ 4) как вы проверите , что XML не валидный ? Изменение
на
это изменение формата файла. За это несет ответственность тот, кто это сделал. Он должен был вам (и другим) как то об этом сообщить. Изменение префикса пространства имен - это НЕ изменение формата, о таких вещах никто не должен вас оповещать и придраться к ним будет нельзя. |
||||
|
|||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Нужно обосновывать, а не просто говорить. ![]() А мне кажется нужно задуматься прежде - какая стоит задача. ![]() Все зависит от того, насколько хорошо ты владеешь регулярными выражениями, и вообще понимаешь парсинг. Умение сипользовать регулярные выражения, не одно и то же что уметь писать на перле ![]() А оно мне нужно?? Если меня попросили распарсить файл, а не проверять его валидность, формат и т.п. Это две разные задачи ![]() А тут не стоит мешать все в кучу, и обособлять лишь то, что удобно в твоем варианте. ![]() sir_nuf_nuf, ты еще очень мало работал с регулярными выражениями, это во-первых. Во-вторых с такими взглядами, ты можешь написать приложение, которое будет делать все, но при этом будет требовать столько ресурсов и времени на свое выполнение, что оно будет бесполезным ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
Шерлок Холмс завидует вашей дедукции =) если хотите продемострировать всю мощь регулярных выражений, предложите решение например такой задачи: Есть такой формат Atom - лента объявлений/новостей. В таком xml есть элемент link - ссылка на что либо. link может быть у <feed> , у <entry> и , кроме того в <entry> может быть <content> в котором автор может вообще размещать что угодно. Пожалуйста найдите все ссылки в объявления некого автора (Васи Пупкина, например). Или предложите осмысленную задачу на разбор XML для решени которой regex удобнее. |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
Лучше приведи XML текст. А то предложение почитать спецификацию на англ. что бы самому сочинить себе XML, а потом с успехом его парсануть, выглядит нелепым.
|
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
собственно нужно выбрать все ссылки которые в объявлениях от Pupkin rabler.ru yahoo.ru google.ru ya.ru Это сообщение отредактировал(а) sir_nuf_nuf - 25.6.2008, 08:05 |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Набросал сразу, поэтому это еще не факт, что мой код самый простой, возможно, вполне возможно, что можно написать его еще проще с помощью тех же регулярных выражений ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 6 Всего: 49 |
Уважаемый sir_nuf_nuf, из любого правила бывают исключения
предлагаю: задача осмысленная, хотя сам я именно ее не решал. На сайте ozon.ru есть прайс в формате XML http://www.ozon.ru/multimedia/zip/yandexbooks.zip (более 200 Мб). Выберите из него данные по книге с определенным идентификатором (любой, по Вашему желанию). Если, вдруг, решите написать скрипт, огласите время его работы и занятую скриптом память. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
sir_nuf_nuf |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
+1 - если объем данных большой , то DOM не подойдет, только SAX.. а вот что удобнее SAX или regex - Это уже обсуждается. +2 - если нужно "выбрать данные" т.е. куском XML - то пойдет regex, а если конкретный элемент(ы) - то легче Xpath Тут же ошибка.. вы предполагаете, что в теле <entry> автор не может употребить свой элемент <entry>. А он может, например так:
проблема даже не в этом конкретном месте, просто чем дальше вы будите пытаться тем больще таких новостей будите открывать... Это сообщение отредактировал(а) sir_nuf_nuf - 25.6.2008, 11:40 |
||||
|
|||||
GoDleSS |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 11.2.2007 Где: Пироговский Репутация: нет Всего: 2 |
Очень интересная, кстати, задачка, сводящаяся в большей части к построению грамотных индексов. Хотя если выборка предстоит однарозовая(в чем сильно сомневаюсь), то к условному построчному чтению. --------------------
It's a nice day to die my friend! |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Это не ошибка. Я предлагаю тебе понять одну простую вещь - передо мной стоит конкретная задача - я решаю конкретную задачу. Зачем тогда в софте пишут "version 1.0", "version 1.4" и т.п.?? Перед тобой стоят конкретные задачи и ты их решаешь. Если со временем появляются новые задачи, появляются новые версии решения задачи, патчи и т.п. Иначе бы мы всегда имели лишь одну версию любого софтверного инструмента ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
Вы о чем ? это одна и та же версия - называется Atom 1.0
Я соглашаюсь понять эту вещь =) Не стоит наезжать, я грамотный человек и опыта тоже хватает. Пару месяцев назад мы тоже решили решить конкретную задачу по обработке XML с помощью regex и других текстовых манипуляций - и вот начали появляться первые проблемы, т.к. XML стал меняться (не формат, а содержимое). Нам приходится заниматься поддержкой такого решения, поэтому планируем в ближайшее время перейти на DOM. Я предлагаю остаться при своих мнениях. |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Я сейчас говорю не конкретных вещях. А в целом.
Ну, не я начал разбрасыватся такими фразами как "Ошибка". Я почти два года занимался тем, что писал на перле программы, которые занимались парсингом тех или иных файлов. И тоже сталкивался с проблемами, а порой приходилось какие-то пункты(не подпункты), вообще переделывать по-другому нежели в ТЗ. Это вполне естественное явление в программировании. И стоит ли по этому поводу говорить, что это ошибка ?? ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: нет Всего: 31 |
Да, вы правы, я как всегда некорректен =) больше не буду. вообщем вся моя идея заключалась в том, что regex не для всего подходит. для многоно , но для XML - плохо. Если вы утверждаете, что разбор XML с помощью regex правильнее и лучше, чем с помощью DOM, SAX и Xpath, то я могу попросить только не убеждать в этом других. Это сообщение отредактировал(а) sir_nuf_nuf - 25.6.2008, 18:32 |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
sir_nuf_nuf
regex универсальный, а вместе с встроенным функциями index, sunbstr можно получить очень приличную скорость, гибкость, экономию ресурсов и легкость. А вложенность тега entry легво можно обойти. Для этого перед началом работы основной процедуры. Нужно пройтись по xml документу и всем вложенным entry присвоить уровень вложенности. entry->entry1 и т.д. Благодаря тому что xml строже htm,l то тут можно вовсю использовать index и substr, а это самые быстрые функции для работы с текстом. К вам такая же просьба не убеждать других что парсить htm и xml и т.д рег. выражениями есть зло |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
не убедят ![]() sir_nuf_nuf, началось после, того как вы утверждали кое-что ![]() ![]() ;) |
|||
|
||||
tolkien |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: нет Всего: 4 |
sir_nuf_nuf
С вашей задачей справились. А вот вы можете справиться вот с такой задачей используя парсер html. Нужно получить все курсы валют от сюда savechange.ru. И вывести их в такой таблице Валюта_IN,число,Валюта_OUT,число,RESERVE_Валюта_OUT,число |
|||
|
||||
nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 2 Всего: 84 |
tolkien, он всё же про xml и подобия говорил... html сами знаете какой
![]() |
|||
|
||||
Bulat |
|
|||
![]() татарский Нео ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1701 Регистрация: 22.3.2006 Где: Альметьевск Репутация: нет Всего: 57 |
Ну вот опять... Речь не о том, какой формат файлов парсить, а какая у нас задача. Если тебе нужно будет написать один(!) парсер, работающий как и с XML, так и с HTML, а может и еще с каким-нить интересным форматом файла?? Подчеркиваю один общий парсер?? ![]() -------------------- менеджер по кодеврайтингу ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |