【问题标题】:XML::Simple check if node contains valueXML::简单检查节点是否包含值
【发布时间】:2013-07-04 19:12:16
【问题描述】:

我不知道如何使用 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 是空的,但是如何在代码中检查它??

提前谢谢你

【问题讨论】:

    标签: xml perl xml-simple


    【解决方案1】:

    示例输入会很有用。

    当它为“空”时,它是对空哈希的引用,所以:

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

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

    【讨论】:

      【解决方案2】:
      print Dumper($property->{'boiler'}) if $property->{'boiler'} != 0 ;
      

      【讨论】:

      • if $property->{'boiler'} == 0 检查是否为空))谢谢!
      • 不,这是完全错误的。它测试数值是否为 0(对于示例中的所有“非空”字符串,它恰好是 0,如果启用警告,则会发出警告)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多