1

我通过调用递归方法处理几个 XML 文件process_node

    for my $file (@ARGV) {
            my $doc = XML::LibXML->load_xml(location => $file);

            my $report;
            my $items = [];

            process_node($doc->getDocumentElement, $report, $items);

            print Dumper($items);
    }

它们都有相似的结构:

  • CalRunnerReport一个以属性BSN, ProjectName,命名的大父节点StationName
  • 并且许多子节点命名为TestItem

我正在尝试准备变量引用的哈希数组$items- 用作 DataTables.net(HTML 表格组件)的数据源:

sub process_node($$$) {
        my ($node, $report, $items) = @_;

        return unless $node->nodeType == XML_ELEMENT_NODE;

        if ($node->nodeName eq 'CalRunnerReport') {
                my $attr = get_attributes($node);
                $report = {
                        BSN         => $attr->{BSN},
                        ProjectName => $attr->{ProjectName},
                        StationName => $attr->{StationName},
                }
        } elsif ($node->nodeName eq 'TestItem') {
                my $attr = get_attributes($node);
                push @$items, [      # XXX fails to create a hash
                        %$report,
                        %$attr,
                ];
        }

        for my $child ($node->getChildnodes) {
                process_node($child, $report, $items);
        }
}

sub get_attributes($) {
        my $node = shift;
        my $attr = {};

        for my $a ($node->attributes) {
                my $key = $a->name;
                my $val = $a->value;
                $attr->{$key} = $val;
        }

        return $attr;
}

但是在Data:Dumper输出中我看到push上面的语句没有创建一个哈希,而是一个列表:

      [
        'BSN',
        '1147386447',
        'ProjectName',
        'R089',
        'StationName',
        'B',
        'ExecutionTime',
        '00:00:00',
        'Result',
        'PASS',
        'EndTime',
        '03/09/2013 21:00:03',
        'StartTime',
        '03/09/2013 21:00:03',
        'Name',
        'RecordOperationParameter'
      ],
      [
        'BSN',
        '1147386447',
        'ProjectName',
        'R089',
        'StationName',
        'B',
        'ExecutionTime',
        '00:00:00',
        'Result',
        'PASS',
        'EndTime',
        '03/09/2013 21:00:03',
        'StartTime',
        '03/09/2013 21:00:03',
        'Name',
        'ClearLimitTestPendingList'
      ]

有没有一种很好的方法可以将 2 个散列%$report%$attr单个散列结合起来 - 而不遍历它们的所有键?

4

1 回答 1

4

你想要这样的东西:

push @$items, { %$report, %$attr };

顺序很重要——在这种情况下,任何共享键的值都来自结果散列中的值$attr而不是值。$report

于 2013-09-05T12:21:32.270 回答