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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсия+DOM 
V
    Опции темы
PuLN
Дата 16.3.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Приветствую!

вот есть файл 
Код

<file>1<ver>text</ver><name>2</name></file>


вот код который выводит то,что в нодах
Код

use XML::DOM;
use XML::Parser;

my $parser = XML::DOM::Parser->new; 
my $doc = $parser->parsefile ("test.xml");

my $root = $doc->getDocumentElement;


my $nodes = $root->getChildNodes;
print $nodes->item(0)->getNodeValue;#выведет то,что в корне дерева.в корневых тегах

my $node1=$nodes->item(1)->getChildNodes;#первый нод
print $node1->item(0)->getNodeValue;

my $node2=$nodes->item(2)->getChildNodes;#второй нод
print $node2->item(0)->getNodeValue;


помогите написать рекурсивный обход?
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 16.3.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



А конкретней, что Вас интересует, просто пройтись по всем ChildNodes и вывести их значение?
PM MAIL Jabber   Вверх
PuLN
Дата 16.3.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да,рекурсивно.я бъюсь уже ой как много...но не получается.
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 17.3.2007, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Сейчас пока устанавливаю XML::DOM. а так посмотрев доку на CPAN нашел такую фичу

$nodes->getLength;

она возвращает число нодов. и делает просто цикл. Должно быть просто.
Когда скачаю попробую smile

Вот накучерявил, но это только то, что касается поставленной Вами задачи smile

Код

#!/usr/bin/perl -w

use XML::DOM;
use XML::Parser;

my $parser = XML::DOM::Parser->new; 
my $doc = $parser->parsefile ("test.txt");

my $root = $doc->getDocumentElement;


my $nodes = $root->getChildNodes;
my $i = $nodes->getLength; #число нодов
my $n = 0; # начинаем с корня. :)

while($n < $i){ 
  my $child = $nodes->item($n)->getChildNodes;
  unless (exists $child->[0]){ # значит это корень
    print $nodes->item($n)->getNodeValue."\n"; #люблю когда данные на разных строчках :)
  }else{
    print $child->item(0)->getNodeValue."\n"; #люблю когда данные на разных строчках :)
  }
  $n++;
}


Все.

Это сообщение отредактировал(а) shamber - 17.3.2007, 00:41
PM MAIL Jabber   Вверх
PuLN
Дата 17.3.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

use XML::DOM;
use XML::Parser;

my $parser = XML::DOM::Parser->new; 
my $doc = $parser->parsefile ("test.xml");
#получаем рут
my $root = $doc->getDocumentElement;

my $nodes = $root->getChildNodes;
my $lenght = $nodes->getLength;# =2 в нашем случае

for(my $i=0;$i<$lenght;$i++){
    my $node = $nodes->item($i); #Если 0-попадаем на первый нод он Element (  <ver> )  если 1-то на второй нод (  <name>)
    if ($node->getNodeType==ELEMENT_NODE){
        my $var = $node->getChildNodes;
        my $n =$var->getLength;
            if($n!=0){
                print $var->item(0)->getNodeValue;
            }
    }
}


вот что сделал.осталось рекурсию воткнуть!
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 17.3.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Так вы сложнее же думаете smile
Вы просто примерчик файла для парсинга подкиньте. может что-нибудь придумаем smile
PM MAIL Jabber   Вверх
PuLN
Дата 17.3.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да пример то все тот же  smile 
Код


<file><ver>text</ver><name>123</name></file>


просто я с рекурсией не дружу((
хотя в теории знаю,что это.

Это сообщение отредактировал(а) PuLN - 17.3.2007, 00:51
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 17.3.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Для него  мой кусочек корявого кода подходит.




Это сообщение отредактировал(а) shamber - 17.3.2007, 01:12
PM MAIL Jabber   Вверх
PuLN
Дата 17.3.2007, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



отлично.

Это сообщение отредактировал(а) PuLN - 17.3.2007, 22:16
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 17.3.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Мысль два. Wake Up - как говорилось в одной песне..

Код

use XML::DOM;
use XML::Parser;

my $parser = XML::DOM::Parser->new; 
my $doc = $parser->parsefile ("test.txt");

my $root = $doc->getDocumentElement;

parseElement($root);


sub parseElement{
  $element = shift;
  my $nodes = $element->getChildNodes;
    my $i = $nodes->getLength; #число нодов
    my $n = 0;
    while($n<$i){
      my $child = $nodes->item($n);
    if ($child->getNodeType == TEXT_NODE){
       print $child->getNodeValue."\n";
    }if ($child->getNodeType == ELEMENT_NODE){
      parseElement($child);
    }
      $n++;
      
    }
}


Забирайте рекурсию. ( надеюсь это она ;))

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

Это сообщение отредактировал(а) shamber - 17.3.2007, 01:15
PM MAIL Jabber   Вверх
PuLN
Дата 17.3.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



спасибо тебе,shamber
кстати,на счет проверки на другие типы нодов,так и задумывалось)
--------------------
*** хуже нет,когда не ответит тот,кто знает....*** наша жизнь-желтая стрела,подхваченная ветром времени(© PuLN)   
PM MAIL   Вверх
shamber
Дата 17.3.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



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


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

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


 




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


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

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