无法在未定义的值上调用方法“getData”

时间:2011-01-05 16:19:06

标签: xml perl

我粘贴了一些有缺陷的代码:

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: ".$@."\n" if $@;

这里我收到以下错误:E R R O R:无法在/qflife/news/newsaktuell/news_aktuell_api.pl上的未定义值上调用方法“getData” 身体在那里(在文件中)。 但错误并不总是出现。我的意思是,有时当我让脚本运行相同的文件时,它可以找到正文。我duno我做错了什么。 任何帮助都非常感激!

感谢 问候 magda muskala

4 个答案:

答案 0 :(得分:4)

请发布生成错误的示例XML和生成错误的行#(例如,它是“标题”还是“正文”查找?)。

最有可能的是,这意味着getFirstChild返回了undef,这意味着列表中的第一个节点没有子节点(例如,是一个空的“标题”标记)。

此外,如果您从Web连接获取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 :(得分: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";
}

答案 2 :(得分:1)

您可能应该验证路径$p_node->getElementsByTagName("body")->item(0)->getFirstChild->getData

中每个节点的存在

答案 3 :(得分:0)

您正在使用XPath来获取故事,为什么不使用它来查找标题,而不是使用导航?这样你就可以得到一个结果,或者你没有得到结果,但至少你不会因此而死!

认为 $titel= $p_node->findvalue( '//title[1]/*[1]')应该等同于你写的内容,虽然我怀疑一个更简单的表达也可能有用(正如其他人提到的那样,没有一个例子就很难测试您正在处理的XML。)

我假设你在这里使用XML :: LibXML BTW。