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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск и разбор блока тегов в XML, xml парсинг 
:(
    Опции темы
dron000
Дата 17.11.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день!
Подскажите со следующей задачей, необходимо в xml  искать блоки тегов выдергивать содержимое:
(насчет внешнего совпадающего имени тэга и внутреннего это не опечатка - так и есть)
Код

<name>

<name>...</name>
<name1>...</name1>
<name2>...</name2>
<name3>...</name3>
<name4>...</name4>
<name5>...</name5>
...
</name>


К примеру 
Код

$reg =~|<name>
<name>(.*)</name>
<name1>(.*)</name1>
<name2>(.*)</name2>
<name3>(.*)</name3>
<name4>(.*)</name4>
<name5>(.*)</name5>
</name>|$1,$2,$3,$4,$5|ig

Долго и не работает. Имена и количество полей известны и постоянны, порядок следования постоянен.Есть какие-то методы поиска целых кусков?

PM MAIL   Вверх
Bulat
Дата 17.11.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dron000 @  17.11.2009,  16:03 Найти цитируемый пост)
Долго и не работает. Имена и количество полей известны и постоянны, порядок следования постоянен.Есть какие-то методы поиска целых кусков


А почему бы не заюзать стандартный XML-parser ?? Допустим XML::Simple, ну или что "потяжелее" - если не достаточно функциональности. smile


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


Бывалый
*


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

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



Подкинешь нормальную ссылку с описанием?
PM MAIL   Вверх
Bulat
Дата 17.11.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dron000 @  17.11.2009,  16:50 Найти цитируемый пост)
Подкинешь нормальную ссылку с описанием? 


http://search.cpan.org/~pajas/XML-LibXML-1.70/LibXML.pod - лично я использую оный smile Правда он "тяжелый", для себя можешь чего полегче на cpan'e поискать smile


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


Эксперт
***


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

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



dron000, советую попробовать XML::Parser. Меня очень порадовала скорость обработки 300Мб XML-файлов.


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


Бывалый
*


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

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



Спасибо.Нашел XML-Simple вроде вполне подойдет только интересует вопрос можно ли там получаемую структуру как-то посмотреть, потому как если xml'ник  'сложной' структуры то не очень удобно будет писать. У меня вроде бы о больших объемах речь пока не идет но все таки интересно parser намного быстрей?
PM MAIL   Вверх
sir_nuf_nuf
Дата 17.11.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dron000, сооветую попробовать XML::LibXML и XML::LibXML::Simple - очень надежные и мощные библиотеки. от Gnome =)


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


Бывалый
*


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

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



Делаю следующее:
Код

use XML::Simple; 
use Data::Dumper;

#готовим $my_xml

 my $xs = XML::Simple->new(ForceArray => 1, KeepRoot => 1); 
 my $ref= $xs->XMLin($my_xml);
 my $my_xml= $xs->XMLout($ref);
 print Dumper($ref);
 
# например 
 $ref1=$ref->{name}->[1]; 



Возникает ошибка: junk after document element at line 1, column 456, byte 456 at C:/perl/lib/XML/Parser.pm line 187,
Открыл пакет XML Simple 2.18 это как раз тело sub XMLin{},блок 

Код


 elsif(my $type = ref($target)) {
    if($type eq 'SCALAR') {
      return $self->parse_string($target, @_);
    }
    else {
      return $self->parse_fh($target, @_);
    }
  }


Как я понял проблем в этой  строке return $self->parse_fh($target, @_);
Кто нибудь сталкиваля с подобным?
PM MAIL   Вверх
Bulat
Дата 18.11.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dron000 @  18.11.2009,  11:00 Найти цитируемый пост)
#готовим $my_xml


а вот на это можно взглянуть?? smile



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


Бывалый
*


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

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



Да собственно  переменная $my_xml получает строку состоящую из блоков вида:
Код

<name>

<name>...</name>
<name1>...</name1>
<name2>...</name2>
<name3>...</name3>
<name4>...</name4>
<name5>...</name5>
...
</name>


Синтаксис проверял и в валидаторе и сам - ошибок нет.Или там какой-то особый формат должен быть?
PM MAIL   Вверх
Bulat
Дата 18.11.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

#!/usr/bin/perl

use strict;

use XML::Simple; 
use Data::Dumper;
my $my_xml = "
<name>
<name>123</name>
<name1>321</name1>
<name2>432</name2>
<name3>543</name3>
<name4>654</name4>
<name5>765</name5>
</name>
";

 my $xs = XML::Simple->new(ForceArray => 1, KeepRoot => 1); 
 my $ref= $xs->XMLin($my_xml);
 my $my_xml1= $xs->XMLout($ref);
 print Dumper($ref);
 

 print $ref->{name} -> [0] -> {name2} -> [0], "\n";


обрати внимание на свой вариант - 

Цитата(dron000 @  18.11.2009,  11:00 Найти цитируемый пост)
 my $ref= $xs->XMLin($my_xml);
 my $my_xml= $xs->XMLout($ref);


не хорошо так писать.


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


Бывалый
*


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

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



К примеру  при 

Код

$my_xml=
'<name1>35434</name1>
<name2>dfdfdf</name2>';



происходит таже ошибка, если оставить только  '<name1>35434</name1> то можно обратиться $ref->{name1}->[0];  и работает без ошибок.

Добавлено через 8 минут и 26 секунд
Гы... smile  Вижу....совсем окасел тут... smile 
PM MAIL   Вверх
dron000
Дата 18.11.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Заранее извиняюсь если вопрос тупой.А как обратиться если таких блоков несколько например два

Код

my $my_xml = "
<name>
<name>123</name>
<name1>321</name1>
<name2>432</name2>
<name3>543</name3>
<name4>654</name4>
<name5>765</name5>
</name>
<name>
<name>123</name>
<name1>321</name1>
<name2>432</name2>
<name3>543</name3>
<name4>654</name4>
<name5>765</name5>
</name>
";


Потому как такое обращение уже не прокатывает  print $ref->{name} -> [0] -> {name2} -> [0] -выдает аналогичную ошибку пакета...
Не понятно почему, ведь даж относительный адрес указанного элемента не меняется...или я чего-то не понимаю?

PM MAIL   Вверх
sir_nuf_nuf
Дата 18.11.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dron000 @  18.11.2009,  16:35 Найти цитируемый пост)
А как обратиться если таких блоков несколько например два

Никак. То что вы написали не является XML.

Изучите какой-нть простой мануал по XML - исчезнут такие вопросы.
Кстати как я помню,  в начале XML не допускаются никакие символы до первого тэга.

P.S.
Можно использовать XML::LibXML::Simple за место XML::Simple - интерфейс тот же, но более надежна.


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


Бывалый
*


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

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



Ну да, вот так лучше будет:

Код

my $my_xml = "
<name_all>
<name>
<name>123</name>
<name1>321</name1>
<name2>432</name2>
<name3>543</name3>
<name4>654</name4>
<name5>765</name5>
</name>
<name>
<name>123</name>
<name1>321</name1>
<name2>432</name2>
<name3>543</name3>
<name4>654</name4>
<name5>765</name5>
</name>
</name_all>
";


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


 




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


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

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