| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > parsing xml |
| Автор: yodgik1 20.6.2008, 17:22 | ||
подскажите как мне вытащить из xml такого вида
всё начиная с <soap:aa> и заканчивая </soap:aa> спасибо. |
| Автор: nitr 20.6.2008, 17:31 | ||
| yodgik1, вообще-то много очень обсуждалось про XML. Вы бы сначала поиском воспользовались! Вам для этого модуль не нужен, но во многих это желательно.
|
| Автор: ginnie 20.6.2008, 17:33 | ||
Уважаемый yodgik1, попробуйте
|
| Автор: nitr 20.6.2008, 17:37 |
| yodgik1, я привел пример между Добавлено через 8 секунд <soap:aa> ... </soap:aa> Добавлено через 38 секунд Возможно ginnie более прав, если Добавлено через 1 минуту и 40 секунд Т.к. я не понимаю если это весь XML, то зачем из него его же и получать ;) Добавлено через 4 минуты и 40 секунд yodgik1, ответьте, не мучайте ;) |
| Автор: tolkien 21.6.2008, 02:13 | ||||
Немного офтопа. <soap:aa>.+?</soap:aa> Меня такие конструкции страшно забавляют. Они всегда исправно работают или нет? В данном шаблоне получается PERL должен угадать, что вам надо. А это значит он может ошибиться и не угадать. |
| Автор: sir_nuf_nuf 22.6.2008, 11:46 | ||
| не, не всегда. они срабатыват пока не поменяется префикс пространства имен в 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 23.6.2008, 15:58 | ||||
Отнюдь. Такие изменения могут быть вообще в любом файле. Сегодня парсишь один файл логов, с парой, где
А завтра станет
И что теперь?? Вообще использование регулярных выражений зло?? |
| Автор: sir_nuf_nuf 24.6.2008, 09:28 | ||||
1) Это не надежное решение. Плохой стиль. 2) XPath намного удобней regex при работе с XML. 3) Вот как вы проверяете работу regex ? Да просто берет и проверяете на 1 XML. В результате вы можете быть уверены, что ваш regex работает на 1 xml. Завтра может прийти другой, на котором не работает. Например банально пробелов добавили (которые убираются нормализацией XML), поменяли префиксы, или в какой-то тэг добавили атрибут, а вы его раньше искали как /<bla>/ 4) как вы проверите , что XML не валидный ? Изменение
на
это изменение формата файла. За это несет ответственность тот, кто это сделал. Он должен был вам (и другим) как то об этом сообщить. Изменение префикса пространства имен - это НЕ изменение формата, о таких вещах никто не должен вас оповещать и придраться к ним будет нельзя. |
| Автор: sir_nuf_nuf 24.6.2008, 21:00 |
Шерлок Холмс завидует вашей дедукции =) если хотите продемострировать всю мощь регулярных выражений, предложите решение например такой задачи: Есть такой формат http://tools.ietf.org/html/rfc4287 - лента объявлений/новостей. В таком xml есть элемент link - ссылка на что либо. link может быть у <feed> , у <entry> и , кроме того в <entry> может быть <content> в котором автор может вообще размещать что угодно. Пожалуйста найдите все ссылки в объявления некого автора (Васи Пупкина, например). Или предложите осмысленную задачу на разбор XML для решени которой regex удобнее. |
| Автор: tolkien 25.6.2008, 00:52 |
| Лучше приведи XML текст. А то предложение почитать спецификацию на англ. что бы самому сочинить себе XML, а потом с успехом его парсануть, выглядит нелепым. |
| Автор: sir_nuf_nuf 25.6.2008, 08:04 | ||
собственно нужно выбрать все ссылки которые в объявлениях от Pupkin rabler.ru yahoo.ru google.ru ya.ru |
| Автор: Bulat 25.6.2008, 10:08 | ||
Набросал сразу, поэтому это еще не факт, что мой код самый простой, возможно, вполне возможно, что можно написать его еще проще с помощью тех же регулярных выражений |
| Автор: ginnie 25.6.2008, 11:16 | ||
Уважаемый sir_nuf_nuf, из любого правила бывают исключения
предлагаю: задача осмысленная, хотя сам я именно ее не решал. На сайте ozon.ru есть прайс в формате XML http://www.ozon.ru/multimedia/zip/yandexbooks.zip (более 200 Мб). Выберите из него данные по книге с определенным идентификатором (любой, по Вашему желанию). Если, вдруг, решите написать скрипт, огласите время его работы и занятую скриптом память. |
| Автор: sir_nuf_nuf 25.6.2008, 11:38 | ||||
+1 - если объем данных большой , то DOM не подойдет, только SAX.. а вот что удобнее SAX или regex - Это уже обсуждается. +2 - если нужно "выбрать данные" т.е. куском XML - то пойдет regex, а если конкретный элемент(ы) - то легче Xpath Тут же ошибка.. вы предполагаете, что в теле <entry> автор не может употребить свой элемент <entry>. А он может, например так:
проблема даже не в этом конкретном месте, просто чем дальше вы будите пытаться тем больще таких новостей будите открывать... |
| Автор: GoDleSS 25.6.2008, 11:44 | ||
Очень интересная, кстати, задачка, сводящаяся в большей части к построению грамотных индексов. Хотя если выборка предстоит однарозовая(в чем сильно сомневаюсь), то к условному построчному чтению. |
| Автор: Bulat 25.6.2008, 12:59 | ||
Это не ошибка. Я предлагаю тебе понять одну простую вещь - передо мной стоит конкретная задача - я решаю конкретную задачу. Зачем тогда в софте пишут "version 1.0", "version 1.4" и т.п.?? Перед тобой стоят конкретные задачи и ты их решаешь. Если со временем появляются новые задачи, появляются новые версии решения задачи, патчи и т.п. Иначе бы мы всегда имели лишь одну версию любого софтверного инструмента |
| Автор: sir_nuf_nuf 25.6.2008, 14:17 | ||
Вы о чем ? это одна и та же версия - называется Atom 1.0
Я соглашаюсь понять эту вещь =) Не стоит наезжать, я грамотный человек и опыта тоже хватает. Пару месяцев назад мы тоже решили решить конкретную задачу по обработке XML с помощью regex и других текстовых манипуляций - и вот начали появляться первые проблемы, т.к. XML стал меняться (не формат, а содержимое). Нам приходится заниматься поддержкой такого решения, поэтому планируем в ближайшее время перейти на DOM. Я предлагаю остаться при своих мнениях. |
| Автор: Bulat 25.6.2008, 14:50 | ||||
Я сейчас говорю не конкретных вещях. А в целом.
Ну, не я начал разбрасыватся такими фразами как "Ошибка".
Я почти два года занимался тем, что писал на перле программы, которые занимались парсингом тех или иных файлов. И тоже сталкивался с проблемами, а порой приходилось какие-то пункты(не подпункты), вообще переделывать по-другому нежели в ТЗ. Это вполне естественное явление в программировании. И стоит ли по этому поводу говорить, что это ошибка ?? |
| Автор: sir_nuf_nuf 25.6.2008, 18:31 |
Да, вы правы, я как всегда некорректен =) больше не буду. вообщем вся моя идея заключалась в том, что regex не для всего подходит. для многоно , но для XML - плохо. Если вы утверждаете, что разбор XML с помощью regex правильнее и лучше, чем с помощью DOM, SAX и Xpath, то я могу попросить только не убеждать в этом других. |
| Автор: tolkien 25.6.2008, 19:40 |
| sir_nuf_nuf regex универсальный, а вместе с встроенным функциями index, sunbstr можно получить очень приличную скорость, гибкость, экономию ресурсов и легкость. А вложенность тега entry легво можно обойти. Для этого перед началом работы основной процедуры. Нужно пройтись по xml документу и всем вложенным entry присвоить уровень вложенности. entry->entry1 и т.д. Благодаря тому что xml строже htm,l то тут можно вовсю использовать index и substr, а это самые быстрые функции для работы с текстом. К вам такая же просьба не убеждать других что парсить htm и xml и т.д рег. выражениями есть зло |
| Автор: nitr 25.6.2008, 19:41 |
не убедят sir_nuf_nuf, началось после, того как вы утверждали кое-что ;) |
| Автор: tolkien 25.6.2008, 20:08 |
| sir_nuf_nuf С вашей задачей справились. А вот вы можете справиться вот с такой задачей используя парсер html. Нужно получить все курсы валют от сюда savechange.ru. И вывести их в такой таблице Валюта_IN,число,Валюта_OUT,число,RESERVE_Валюта_OUT,число |
| Автор: nitr 25.6.2008, 20:47 |
| tolkien, он всё же про xml и подобия говорил... html сами знаете какой |
| Автор: Bulat 26.6.2008, 09:45 | ||
Ну вот опять... Речь не о том, какой формат файлов парсить, а какая у нас задача. Если тебе нужно будет написать один(!) парсер, работающий как и с XML, так и с HTML, а может и еще с каким-нить интересным форматом файла?? Подчеркиваю один общий парсер?? |