【问题标题】:How to check array is null or empty or it contains elements in perl language如何检查数组是否为空或为空,或者它包含 perl 语言中的元素
【发布时间】:2019-10-22 16:01:18
【问题描述】:

我正在解析以下 XML 并从 XML 数据中获取 IP 地址。在访问 $region -> { 'IpRange' } 时,它在 ExtractXmlIps.pl 第 45 行作为 Not an ARRAY reference 抛出错误。有时 Region 不包含任何值。在这种情况下,我会收到此错误。当我添加像“if($region && $region -> {'IpRange'})”这样的检查时,它仍然抛出错误。

<?xml version="1.0" encoding="utf-8"?>
<IpAddresses xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Region Name="us" />
<Region Name="asia">
    <IpRange Subnet="10.10.10.0/21" />
</Region>
</IpAddresses>

解析xml的代码:

getstore ( $urls[0], $file_path );
my $xml = new XML::Simple;
my $xml_data = $xml -> XMLin ( $file_path );
foreach my $region ( @{ $xml_data -> { 'Region' } } ) {
    foreach my $ip ( @{ $region -> { 'IpRange' } } ) {
        print $ip;
    }
}

我为区域和区域内添加了空检查。试图找到数组的长度并添加了该检查。

【问题讨论】:

  • 你能展示你在做什么吗?更多相关代码?我们不知道“ExtractXmlIps.pl”是什么样的,也不知道你如何“解析xml”,也不知道它是什么“error”投掷,也不是你的“null check”是什么。
  • Follwong 是 XML: 在上面的第一个循环中的 xml 中,我在第二个循环中获取区域,我正在获取 ips。某些区域不包含值,因此 @{ $region -> { 'IpRange' } } 抛出错误。
  • @KarthikS,请edit the question 添加缺少的代码和错误文本。我们需要能够运行代码才能重现问题。
  • XML::简单?嗯...这是一些旧的现有程序吗?从the documentation 的第一行开始:请不要在新代码中使用此模块。

标签: xml perl


【解决方案1】:

查看 XML::Simple 的文档,当只有一个子元素时,它返回为 name =&gt; 'value',而不是您的代码所期望的 name =&gt; [ 'value' ]。你可以改变

$xml_data = $xml -> XMLin ( $file_path );

$xml_data = $xml -> XMLin ( $file_path, ForceArray => 1 );

这样所有子元素都作为数组引用返回。

【讨论】:

    【解决方案2】:

    这是不阅读文档的情况。使用strict mode

    use 5.010;
    use XML::Simple qw(:strict);
    my $xs = XML::Simple->new(ForceArray => 1, KeyAttr => []);
    my $root = $xs->XMLin('so-56489347.xml');
    foreach my $region (@{$root->{Region}}) {
        foreach my $iprange (@{$region->{IpRange}}) {
            say $iprange->{Subnet};
        }
    }
    

    文档还说要改用XML::LibXML

    use 5.010;
    use XML::LibXML qw();
    my $root = XML::LibXML->load_xml(location => 'so-56489347.xml')->documentElement;
    foreach my $region ($root->getChildrenByTagName('Region')) {
        foreach my $iprange ($region->getChildrenByTagName('IpRange')) {
            say $iprange->getAttribute('Subnet');
        }
    }
    

    但是当您拥有该库时,您可以简单地使用 XPath 来查找所需的 XML 元素,而且要短得多!

    use 5.010;
    use XML::LibXML qw();
    my $doc = XML::LibXML->load_xml(location => 'so-56489347.xml');
    for my $iprange ($doc->findnodes('//Region/IpRange[@Subnet]')) {
        say $iprange->getAttribute('Subnet');
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多