我粘贴了一些有缺陷的代码:
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
答案 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。