我正在尝试使用perl来解析XML,而且我遇到了一些奇怪的东西。当我调用$ node-> attributes()时,它似乎在某些情况下会返回一个未定义的值。如果您查看标有问题的行,您可以看到我是否已添加。我原以为如果节点没有属性那么foreach就没有任何东西可以循环了。如果我取消注释那条线上的if都可以。 (我知道我可以把检查放在循环外面,但我想知道为什么我需要检查)
#!/usr/bin/perl
use strict;
use warnings;
my $filename = 'lib.xml';
use XML::LibXML;
my $parser = XML::LibXML->new();
$parser->keep_blanks(0);
my $doc = $parser->parse_file($filename);
sub process_node {
my $level = shift;
my $node = shift;
printf ("%*s", $level, "");
print $node->nodeName;
print "<", $node->nodeValue,">" if (defined($node->nodeValue));
print "\n";
print "attrs:\n";
foreach ($node->attributes()){
print $_->name,":",$_->value," " ;# if (defined($_)); ### problem
}
print "\n";
for my $child ($node->childNodes) {
process_node($level+1, $child);
}
}
process_node(1, $doc->documentElement);
这是lib.xml的内容:
<data size="4">
<stuff src="one" dst="two" />
hmm
</data>
这是“坏”输出:
>>> ./xml.pl
data
attrs:
size:4
stuff
attrs:
src:one dst:two
text<
hmm
>
attrs:
Can't call method "name" on an undefined value at ./xml.pl line 26.
当我取消注释if
时的好处>>> ./xml.pl
data
attrs:
size:4
stuff
attrs:
src:one dst:two
text<
hmm
>
attrs:
答案 0 :(得分:4)
这是因为我认为是XML::LibXML::Text::attributes
中的一个错误,看起来像这个
sub attributes { return undef; }
这应该是
sub attributes { return }
将返回标量上下文中的undef
和列表上下文中的空列表
如果需要,您可以自行修复。在最新版本的模块 - 2.0123中 - 它位于LibXML.pm
安装中XML::LibXML
的第1789行。您可以通过运行
perldoc -l XML::LibXML
我将向维护者提交错误报告