Модераторы: 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   Вверх
krypt3r
Дата 19.11.2009, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ошибаетесь, ничем не лучше
PM MAIL   Вверх
Bulat
Дата 19.11.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



dron000, 

на самом деле, составление xml-файлов - некое правило...

во-первых у любого xml-файла в самом начале должно быть <?xml version="1.0" encoding="UTF-8"?>

"encoding="UTF-8"" - опционально.

Во-вторых любой xml-файл должен иметь root-узел.

Т.е. некий начальный тег, отличный от остальных

my $my_xml = qq{<?xml version="1.0" encoding="UTF-8"?>}.
qq{<root>}.
qq{<name>123</name>}.
qq{<name1>321</name1>}.
qq{<name2>432</name2>}.
qq{<name3>543</name3>}.
qq{<name4>654</name4>}.
qq{<name5>765</name5>}.
qq{</name>}.
qq{<name>}.
qq{<name>123</name>}.
qq{<name1>321</name1>}.
qq{<name2>432</name2>}.
qq{<name3>543</name3>}.
qq{<name4>654</name4>}.
qq{<name5>765</name5>}.
qq{</root>}
};

вот что-то подобное smile


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


Бывалый
*


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

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



Мне просто не хочется засовывать весь xml'ник там большая часть мне просто не нужна, вот и решил отрезать кусочек). Как я понимаю так работать тоже будет если просто оставить root-узел.
PM MAIL   Вверх
Bulat
Дата 19.11.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dron000 @  19.11.2009,  09:32 Найти цитируемый пост)
Мне просто не хочется засовывать весь xml'ник там большая часть мне просто не нужна, вот и решил отрезать кусочек). Как я понимаю так работать тоже будет если просто оставить root-узел. 


В том-то и дело, что все подобные библиотеки рассчитаны на то, что на входе абсолютно верные и цельные параметры.. Т.е. у всех вещей есть "обязательные" части.

Вообще, я просто написал пример, отразив в нем обязательные части любого xml-файла. Если не сработает - будем разбираться дальше. smile


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


Бывалый
*


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

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



Все ок, работает.Те части которые мне нужны и не совсем подходят под формат просто дополняю 'ручками'. Жаль в этих пакетах обработки ошибок толковой нет.
PM MAIL   Вверх
Bulat
Дата 19.11.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dron000 @  19.11.2009,  14:32 Найти цитируемый пост)
Жаль в этих пакетах обработки ошибок толковой нет. 


Если ты имеешь ввиду, обработки ошибок на отсутствие 
Код

<?xml version="1.0" encoding="UTF-8"?>
<root>
...
</root>


то совсем и не обязательно, чтобы они присутствовали... Если в твоем документе(файле и т.п.) отсутствуют эти части - значит на входе у тебя все что угодно, но не xml-данные(xml-файл)

В конце концов, без этих частей, твой файл может быть html-разметкой
Код

<name></name>
<table></table>


или мож вообще каким-нить конфигом апача  smile 

А мож еще что-то. smile


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


 




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


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

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