将数据元素及其属性从数据集中解析为数组

Parsing data elements and it's attributes from dataset into an array

我有一个包含不同类型计划的数据集,下面的数据显示了 activeplans 和 pastplans 元素(以及示例中未包含的其他计划)。

我觉得数据可以表示如下

$data->activeplans->activeplanloc[activeplan->{}, activeplan->{},
...activeplan->{}] $data->pastplans->pastplanloc[pastplan->{},
pastplan->{}, ...pastplan->{}]

每个计划元素都有多个属性,例如 id、lat、long、numpersons(以及示例中未包含的其他属性)

我的目标是遍历所有计划项目并提取属性。

另请注意,...planloc[] 外部元素及其包含的 lat/long 字段以及空 ...plan[] - 可以忽略。

这是我尝试使用的循环,但我一直在严格执行 activeplan 元素,你能帮助纠正我的语法错误吗,我现在不知道如何将元素正确加载到给定的数组中这个数据结构?

foreach my $planArrayItem (@{$data->{"activeplans"}->{"activeplanloc"}->{"activeplan"}{}}) { 
    #...
    if (exists $planArrayItem->{numpersons}) {
        $tmp .= "<li>Number of personal: $projArrayItem->{numpersons}</li>";
    } 
    #...
}

哦,这是数据集。

{ 'updatetime' => '3/24/2021 11:44:19 AM', 'pastplans' => 
{ 'pastplanloc' => [ { 'longitude' => '-29.51502', 'latitude' =>
 '32.307558', 'pastplan' => { 'planclass' => 'A', 'longitude' =>
 '-29.51502', 'id' => '211', 'latitude' => '32.307558', 
 'numlocations' => '15' } }, { 'longitude' => '-28.798305',
 'latitude' => '32.656135', 'pastplan' => [ { 'id' => '214',
 'longitude' => '-28.798305', 'latitude' => '32.656135',
 'planclass' => 'E', 'numlocations' => '16' }, { 'longitude' => 
 '-28.798305', 'id' => '215', 'latitude' => '32.656135', 'planclass'
 => 'C', 'numlocations' => '21' } ] } ] }, 'activeplans' => 
 { 'activeplanloc' => [ { 'latitude' => '33.132491', 'activeplan'
 => [ { 'planclass' => 'B', 'longitude' => '-25.304968', 'id' =>
 '942', 'latitude' => '33.132491', 'numpersons' => '17' }, 
 { 'numpersons' => '21', 'planclass' => 'G', 'id' => '943',
 'longitude' => '-25.304968', 'latitude' => '33.132491' } ],
 'longitude' => '-25.304968' }, { 'latitude' => '33.097290',
 'activeplan' => { 'numpersons' => '31', 'id' => '944',
 'longitude' => '-25.295086', 'latitude' => '33.097290',
 'planclass' => 'M' }, 'longitude' => '-25.295086' } ] } }; 

这是 XML 格式,如果有更好的方式在阅读时格式化它?

<?xml version="1.0" encoding="utf-8"?>
<plans>
    <updatetime>3/24/2021 11:44:19 AM</updatetime>
    <pastplans>
        <pastplanloc latitude="32.307558" longitude="-29.51502">
            <pastplan planclass="A" id="211" numpersons="15" latitude="32.307558" longitude="-29.51502"/>
        </pastplanloc>
        <pastplanloc latitude="32.656135" longitude="-28.798305">
            <pastplan planclass="E" id="214" numpersons="16" latitude="32.656135" longitude="-28.798305"/>
            <pastplan planclass="C" id="215" numpersons="21" latitude="32.656135" longitude="-28.798305"/>
        </pastplanloc>
    </pastplans>
    <activeplans>
        <activeplanloc latitude="33.132491" longitude="-25.304968">
            <activeplan planclass="B" id="942" numpersons="17" latitude="33.132491" longitude="-25.304968"/>
            <activeplan planclass="G" id="943" numpersons="21" latitude="33.132491" longitude="-25.304968"/>
        </activeplanloc>
        <activeplanloc latitude="33.097290" longitude="-25.295086">
            <activeplan planclass="M" id="944" numpersons="31" latitude="33.097290" longitude="-25.295086"/>
        </activeplanloc>
    </activeplans>
</plans>

我很确定:

foreach my $planArrayItem (@{$data->{"activeplans"}->{"activeplanloc"}}) { 
 #...
  if ($planArrayItem->{"activeplan"}{numpersons}) {
     $tmp.= "<li>Number of personal: ".$planArrayItem->{"activeplan"}->{numpersons}."</li>";
  } 
}

是您要查找的代码。如上所述,“activeplanloc”包含一个引用 activeplan 的数组。所以外循环必须迭代这个。

用你的new“数据集”,正确的代码是:

foreach my $planArrayItem (@{$data->{"activeplans"}->{"activeplanloc"}}) { 
    #...
    my $plans = ref $planArrayItem->{"activeplan"} eq "ARRAY" ? 
        $planArrayItem->{"activeplan"} : [$planArrayItem->{"activeplan"}];
    foreach my $plan (@$plans) {
        if ($plan->{numpersons}) {
            $tmp .= "<li>Number of personal: ".$plan->{numpersons}."</li>";
        } 
    }
}

有关工作示例,请参阅 https://pastebin.com/QeD6ZwZz