【问题标题】:Can't call method "getData" on an undefined value无法对未定义的值调用方法“getData”
【发布时间】:2011-06-04 03:10:38
【问题描述】:

我正在粘贴一些错误代码:

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: Can't call method "getData" on an undefined value at /qflife/news/newsaktuell/news_aktuell_api.pl 身体在那里(在文件中)。 但错误并不总是出现。我的意思是有时当我让脚本使用相同的文件运行时,它可以找到正文。我不知道我在做什么错。 任何帮助将不胜感激!

谢谢 你好 玛格达穆斯卡拉

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    请发布产生错误的示例 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
    }
    

    【讨论】:

      【解决方案2】:

      可能值得跟踪您的复杂表达式实际上在什么时候失败。当您像这样将多个方法调用链接在一起时,您最好确定它们都会返回有用的东西。

      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";
      }
      

      【讨论】:

        【解决方案3】:

        也许你应该验证路径$p_node->getElementsByTagName("body")->item(0)->getFirstChild->getData上的每个节点是否存在

        【讨论】:

          【解决方案4】:

          您正在使用 XPath 来获取故事,为什么不使用它来查找标题,而不是使用导航?这样你要么得到结果,要么没有,但至少你不会死去尝试!

          认为 $titel= $p_node->findvalue( '//title[1]/*[1]') 应该等同于您编写的内容,尽管我怀疑更简单的表达式也可能有效(正如其他人所提到的,如果没有您的 XML 示例,很难测试正在处理中)。

          我假设你在这里使用 XML::LibXML 顺便说一句。

          【讨论】:

            猜你喜欢
            • 2013-11-10
            • 1970-01-01
            • 1970-01-01
            • 2019-03-27
            • 1970-01-01
            • 1970-01-01
            • 2016-06-23
            • 2013-09-25
            • 1970-01-01
            相关资源
            最近更新 更多