Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> parsing xml, вытащить xml 
:(
    Опции темы
yodgik1
Дата 20.6.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.6.2007

Репутация: нет
Всего: нет



подскажите как мне вытащить из xml такого вида 
Код

<soap:aa>
<asdf>
<asdfg Time="2006-09-27" Id="1" rId="9" >
<pId>21</pId><sId>1</sId><pPId>3</pPId><aa at="999999" code="SU" />
<p>123</p></asdfg>
</asdf>
</soap:aa>

всё начиная с <soap:aa> и заканчивая </soap:aa> 
спасибо.
PM MAIL   Вверх
nitr
Дата 20.6.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



yodgik1, вообще-то много очень обсуждалось про XML. Вы бы сначала поиском воспользовались!
Вам для этого модуль не нужен, но во многих это желательно.
Код
#!perl
my $xml = '<soap:aa>
<asdf>
<asdfg Time="2006-09-27" Id="1" rId="9" >
<pId>21</pId><sId>1</sId><pPId>3</pPId><aa at="999999" code="SU" />
<p>123</p></asdfg>
</asdf>
</soap:aa>';

print $xml=~/<soap.+?>(.+?)<\/soap.+?>/gsm; #в переменной $1 то что вы хотите



--------------------
PM   Вверх
ginnie
Дата 20.6.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый yodgik1, попробуйте

Код

if ($source =~ m{(<soap:aa>.+?</soap:aa>)}s) {
    print $1;
}



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
nitr
Дата 20.6.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



yodgik1, я привел пример между

Добавлено через 8 секунд
<soap:aa> ... </soap:aa>

Добавлено через 38 секунд
Возможно ginnie более прав, если 
Цитата(yodgik1 @  20.6.2008,  17:22 Найти цитируемый пост)
начиная с <soap:aa> и заканчивая </soap:aa> 


Добавлено через 1 минуту и 40 секунд
Т.к. я не понимаю
если это весь XML, то зачем из него его же и получать ;)

Добавлено через 4 минуты и 40 секунд
yodgik1, ответьте, не мучайте ;)


--------------------
PM   Вверх
tolkien
Дата 21.6.2008, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Цитата(ginnie @ 20.6.2008,  17:33)

Код

if ($source =~ m{(<soap:aa>.+?</soap:aa>)}s) {
    print $1;
}

Немного офтопа. 
<soap:aa>.+?</soap:aa>
Меня такие конструкции страшно забавляют. Они всегда исправно работают или нет? В данном шаблоне получается PERL должен угадать, что вам надо. А это значит он может ошибиться и не угадать. 
PM MAIL   Вверх
sir_nuf_nuf
Дата 22.6.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



не, не всегда.
они срабатыват пока не поменяется префикс пространства имен в XML.
Например ваш XML может выглядеть так:

Код

<zoap:aa>
<asdf>
<asdfg Time="2006-09-27" Id="1" rId="9" >
<pId>21</pId><sId>1</sId><pPId>3</pPId><aa at="999999" code="SU" />
<p>123</p></asdfg>
</asdf>
</zoap:aa>


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ами- зло..


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Bulat
Дата 23.6.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(sir_nuf_nuf @  22.6.2008,  11:46 Найти цитируемый пост)
вообще парсить xml и html regexами- зло.. 


Отнюдь. 

Цитата(sir_nuf_nuf @  22.6.2008,  11:46 Найти цитируемый пост)
soap -> zoap  и быть при этом валидным XML.

Такие изменения могут быть вообще в любом файле. Сегодня парсишь один файл логов, с парой, где
Код

....
start_time=....
....


А завтра станет

Код

...
start-time=.....
....


И что теперь?? Вообще использование регулярных выражений зло?? smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
sir_nuf_nuf
Дата 24.6.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



Цитата(Bulat @  23.6.2008,  15:58 Найти цитируемый пост)
Отнюдь. 


1) Это не надежное решение.  Плохой стиль.
2) XPath намного удобней regex при работе с XML.
3) Вот как вы проверяете работу regex ? Да просто берет и проверяете на 1 XML. 
В результате вы можете быть уверены, что ваш regex работает на 1 xml.
Завтра может прийти другой, на котором не работает. Например банально пробелов добавили 
(которые убираются нормализацией XML), поменяли префиксы, или в какой-то тэг добавили атрибут, а вы его
раньше искали как /<bla>/
4) как вы проверите , что XML не валидный ?


Изменение 
Цитата

start-time 

на 
Цитата

statrt_time


это изменение формата файла. За это несет ответственность тот, кто это сделал. Он должен был вам (и другим)
как то об этом сообщить.

Изменение префикса пространства имен - это НЕ изменение формата, о таких вещах никто не должен вас оповещать
и придраться к ним будет нельзя.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Bulat
Дата 24.6.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Цитата(sir_nuf_nuf @  24.6.2008,  09:28 Найти цитируемый пост)
1) Это не надежное решение.  Плохой стиль.

Нужно обосновывать, а не просто говорить. smile

Цитата(sir_nuf_nuf @  24.6.2008,  09:28 Найти цитируемый пост)
2) XPath намного удобней regex при работе с XML.

А мне кажется нужно задуматься прежде - какая стоит задача. smile

Цитата(sir_nuf_nuf @  24.6.2008,  09:28 Найти цитируемый пост)
3) Вот как вы проверяете работу regex ? Да просто берет и проверяете на 1 XML. 
В результате вы можете быть уверены, что ваш regex работает на 1 xml.
Завтра может прийти другой, на котором не работает. Например банально пробелов добавили 
(которые убираются нормализацией XML), поменяли префиксы, или в какой-то тэг добавили атрибут, а вы его
раньше искали как /<bla>/

Все зависит от того, насколько хорошо ты владеешь регулярными выражениями, и вообще понимаешь парсинг. Умение сипользовать регулярные выражения, не одно и то же что уметь писать на перле smile

Цитата(sir_nuf_nuf @  24.6.2008,  09:28 Найти цитируемый пост)
4) как вы проверите , что XML не валидный ?

А оно мне нужно?? Если меня попросили распарсить файл, а не проверять его валидность, формат и т.п. Это две разные задачи smile


Цитата(sir_nuf_nuf @  24.6.2008,  09:28 Найти цитируемый пост)
это изменение формата файла. За это несет ответственность тот, кто это сделал. Он должен был вам (и другим)
как то об этом сообщить.

Изменение префикса пространства имен - это НЕ изменение формата, о таких вещах никто не должен вас оповещать
и придраться к ним будет нельзя. 

А тут не стоит мешать все в кучу, и обособлять лишь то, что удобно в твоем варианте. smile



sir_nuf_nuf, ты еще очень мало работал с регулярными выражениями, это во-первых. Во-вторых с такими взглядами, ты можешь написать приложение, которое будет делать все, но при этом будет требовать столько ресурсов и времени на свое выполнение, что оно будет бесполезным smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
sir_nuf_nuf
  Дата 24.6.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



Цитата(Bulat @  24.6.2008,  12:00 Найти цитируемый пост)
sir_nuf_nuf, ты еще очень мало работал с регулярными выражениями


Шерлок Холмс завидует вашей дедукции =)



если хотите продемострировать всю мощь регулярных выражений, предложите решение например такой задачи:

Есть такой формат Atom - лента объявлений/новостей.
В таком xml есть элемент link - ссылка на что либо.
link  может быть у <feed> , у <entry> и , кроме того в <entry> может быть <content> в котором
автор может вообще размещать что угодно.
Пожалуйста найдите все ссылки в объявления некого автора (Васи Пупкина, например).


Или предложите осмысленную задачу на разбор XML для решени которой regex удобнее.




--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
tolkien
Дата 25.6.2008, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Лучше приведи XML текст. А то предложение почитать спецификацию на англ. что бы самому сочинить себе XML, а потом с успехом его парсануть, выглядит нелепым. 
PM MAIL   Вверх
sir_nuf_nuf
Дата 25.6.2008, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



Код

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>Example Feed</title>
 <subtitle>A subtitle.</subtitle>
 <link href="http://example.org/feed/" rel="self"/>
 <link href="http://example.org/"/>
 <updated>2003-12-13T18:30:02Z</updated>
 <author>
   <name>John Doe</name>
   <email>[email protected]</email>
 </author>
 <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>

  <entry>
   <title>Atom-Powered Robots Run Amok</title>
   <link href="http://example.org/2003/12/13/atom03"/>
   <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
   <updated>2003-12-13T18:30:02Z</updated>
   <summary>Some text.</summary>
   <author>
     <name>Pupkin</name>
     <email>[email protected]</email>
   </author>
   <content>
      <mycontent xmlns="PupNS" xmlns:pup="PupNS">
         Google link 
         <link href="google.ru"/>
          Yandex link
         <pup:link href="ya.ru"/>
      </mycontent>
   </content>
 </entry>

  <entry>
   <title>Atom-Powered Robots Run Amok</title>
   <link href="http://example.org/2003/12/13/atom03"/>
   <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
   <updated>2003-12-13T18:30:02Z</updated>
   <summary>Some text.</summary>
   <author>
     <name>NotAPupkin</name>
   </author>
   <content>
      <mycontent xmlns="NotPupNS" xmlns:pup="NotAPupNS">
         Give your money!
         I wanna spend all your money!
         <link href="money.ru"/>
          Yes, same prefix.
         <pup:link href="ti.ru"/>
      </mycontent>
   </content>
 </entry>

  <entry>
   <title>Atom-Powered Robots Run Amok</title>
   <link href="http://example.org/2003/12/13/atom03"/>
   <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
   <updated>2003-12-13T18:30:02Z</updated>
   <summary>Some text.</summary>
   <content>
      <mycontent xmlns="PupNS" xmlns:pupy="PupNS">
         yahoo
         <link href="yahoo.ru"/>
          Rambler link
         <pupy:link href="rambler.ru"/>
      </mycontent>
   </content>
   <author>
     <name>Pupkin</name>
   </author>
 </entry>

 </feed>



собственно нужно выбрать все ссылки которые в объявлениях от Pupkin
rabler.ru
yahoo.ru
google.ru
ya.ru

Это сообщение отредактировал(а) sir_nuf_nuf - 25.6.2008, 08:05


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Bulat
Дата 25.6.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



Код

...
my @links;

my @contents = $XML =~ /.*?<entry>(.*?)<\/entry>.*?/gs;

foreach my $con (@contents) {
  if ($con =~ /.*?>Pupkin<.*?/s) {
    my @buff = $con =~ /.*?href="(.*?)"/gs;
    push @links, @buff;
  }
}

print $_, "\n" for @links;


Набросал сразу, поэтому это еще не факт, что мой код самый простой, возможно, вполне возможно, что можно написать его еще проще с помощью тех же регулярных выражений smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
ginnie
Дата 25.6.2008, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый sir_nuf_nuf, из любого правила бывают исключения

Цитата

предложите осмысленную задачу на разбор XML для решени которой regex удобнее.


предлагаю: задача осмысленная, хотя сам я именно ее не решал. На сайте ozon.ru есть прайс в формате XML http://www.ozon.ru/multimedia/zip/yandexbooks.zip (более 200 Мб). Выберите из него данные по книге с определенным идентификатором (любой, по Вашему желанию).

Если, вдруг, решите написать скрипт, огласите время его работы и занятую скриптом память.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
sir_nuf_nuf
Дата 25.6.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: нет
Всего: 31



Цитата(ginnie @  25.6.2008,  11:16 Найти цитируемый пост)
Выберите из него данные по книге с определенным идентификатором (любой, по Вашему желанию).


Цитата(ginnie @  25.6.2008,  11:16 Найти цитируемый пост)
(более 200 Мб)


+1 - если объем данных большой , то DOM не  подойдет, только SAX..  а вот что удобнее SAX или regex - Это уже обсуждается.
+2 - если нужно "выбрать данные" т.е. куском XML - то пойдет regex, а если конкретный элемент(ы) - то легче Xpath




Цитата(Bulat @  25.6.2008,  10:08 Найти цитируемый пост)
my @contents = $XML =~ /.*?<entry>(.*?)<\/entry>.*?/gs;


Тут же ошибка.. вы предполагаете, что в теле <entry> автор не может употребить свой элемент <entry>. А он может, например так:

Код

<entry>
   <title>Atom-Powered Robots Run Amok</title>
   <link href="http://example.org/2003/12/13/atom03"/>
   <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
   <updated>2003-12-13T18:30:02Z</updated>
   <summary>Some text.</summary>
   <author>
     <name>Bupkin</name>
     <email>[email protected]</email>
   </author>
   <content>
      <mycontent xmlns="PupNS">
         <entry> HERE </entry>
      </mycontent>
   </content>
 </entry>


проблема даже не в этом конкретном месте, просто чем дальше вы будите пытаться тем больще таких новостей будите открывать...

Это сообщение отредактировал(а) sir_nuf_nuf - 25.6.2008, 11:40


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1060 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.