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属性BSNProjectName、 で名前が付けられた大きな親ノード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を組み合わせて 1 つのハッシュにする良い方法はありますか?%$attr

4

1 に答える 1