2011-01-05 2 views
1

им склеивание часть кода багги:Невозможно вызвать метод «GetData» на неопределенное значение

eval 
{ 
    if (!($doc = $parser->parse_file($dir . $file))) 
    { 
     print "Parse ERROR: " . $! . "\n"; 
     move($dir . $file, $dirfailed . $file); 
     next; 
    }   
}; 

@nodes = $doc->findnodes("//story")or die "Can't find any '//story' nodes!"; 
foreach my $p_node (@nodes) 
{ 
    $titel = $p_node->getElementsByTagName("title")->item(0)->getFirstChild->getData; 
    print "TITEL:".$titel."\n" ; 
    ## Content/News text 
    $text =""; 
    eval 
    { 
    $text = &formatText($p_node->getElementsByTagName("body")->item(0)->getFirstChild->getData); 
    }; 
    print "\nE R R O R: "[email protected]"\n" if [email protected]; 

здесь я получаю следующее сообщение об ошибке: Ошибка: Не удается вызвать метод «GetData» на условиях неопределенное значение в /qflife/news/newsaktuell/news_aktuell_api.pl тело есть (в файле). , но ошибка появляется не всегда. Я имею в виду иногда, когда я позволяю скрипту работать с тем же файлом, что он может найти тело. i duno, что я делаю неправильно. любая помощь будет очень оценена!

благодарит приветствия Магда muskala

ответ

4

Пожалуйста, пост примера XML, который генерирует сообщение об ошибке, и строка #, который генерирует сообщение об ошибке (например, вл етс его «название» или «тело» поиск?).

Скорее всего, это означает, что getFirstChild возвращает undef, что означает, что первый узел в списке не имел дочерних узлов (например, был пустой тег «title»).

Кроме того, если вы получаете свой XML из веб-соединения в отличие от чтения файла из файловой системы, возможно, вы получаете поврежденный/пустой XML из-за сетевых проблем.

Чтобы предотвратить ошибку, сделать что-то вроде:

my $body = $p_node->getElementsByTagName("body")->item(0)->getFirstChild; 
if (ref $body) { # Make sure it's an object 
    $text = $body->getData; 
} else { 
    # Error handling 
} 
1

Вероятно, вы должны проверить существование каждого узла по пути $p_node->getElementsByTagName("body")->item(0)->getFirstChild->getData

3

Это, вероятно, стоит отслеживания, в которой указать ваше сложное выражение на самом деле терпит неудачу. Когда вы объединяете несколько вызовов методов вместе, вы должны быть уверены, что все они вернут что-то полезное.

my $body = $p_node->getElementsByTagName("body"); 

unless ($body) { 
    die "No body\n"; 
} 

my $item = $body->item(0); 

unless ($item) { 
    die "No item\n"; 
} 

my $first_child = $item->getFirstChild; 

unless ($first_child) { 
    die "No first child\n"; 
} 

my $text = $first_child->getData; 

unless ($text) { 
    die "No text\n"; 
} 
0

Вы используете XPath для получения историй, почему бы вам не использовать его, чтобы найти название, а не использовать навигацию? Таким образом, вы либо получаете результат, либо нет, но, по крайней мере, вы не умираете!

Я думаю что $titel= $p_node->findvalue('//title[1]/*[1]') должно быть эквивалентно тому, что вы написали, хотя я подозреваю, что более простое выражение может также работать (как уже упоминалось, это трудно проверить без примера XML вы обрабатываете).

Я предполагаю, что вы используете XML :: LibXML здесь BTW.

Смежные вопросы