perl with xml:为什么我需要检查是否定义了属性,不应该$ node->属性已经这样做了吗?

时间:2016-02-27 05:14:41

标签: xml perl

我正在尝试使用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:

1 个答案:

答案 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

我将向维护者提交错误报告