![]() |
Модераторы: 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 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |