XML :: Simple检查节点是否包含值

时间:2013-07-04 19:12:16

标签: xml perl xml-simple

我无法弄清楚如何在Perl中检查节点是否包含XML :: Simple模块的值... 这是我的代码:

my $parser = XML::Simple->new;
my $url = 'http://some/xml.aspx';
my $content = get $url or die "Unable to get $url\n";
my $data = $parser->XMLin($content);

print "Content-Type: text/html; charset=utf-8\n\n";
foreach my $property (@{$data->{propertyList}}) {
  if ($property->{'boiler'}) {
    print Dumper($property->{'boiler'});
  }
}

某些Boiler个节点可能为空,输出如下:

$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = {};
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = {};
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = {};
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";
$VAR1 = {};
$VAR1 = "\x{5e9}\x{5de}\x{5e9}";

第四个$VAR1是空的,但我怎么能在代码中检查它?

提前谢谢

2 个答案:

答案 0 :(得分:2)

示例输入很有用。

如果它是"空",它是对空哈希的引用,所以:

if ( ref $property->{'boiler'} && eval { keys %{ $property->{'boiler'} } == 0 } ) {
    print "empty";
}

或者您可以将XML :: Simple SuppressEmpty选项设置为1(完全跳过空节点)或者设置为undef或'' (让空节点获取该值而不是空哈希的默认引用)。正如文档所说,"后两种选择在代码中比在没有键和#34;的哈希中更容易测试。 (但请注意,这会影响所有节点,而不仅仅是Boiler节点,如果您这样做,也会对XML生成产生影响。)

答案 1 :(得分:0)

print Dumper($property->{'boiler'}) if $property->{'boiler'} != 0 ;