再帰メソッドを呼び出して、いくつかの 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
を組み合わせて 1 つのハッシュにする良い方法はありますか?%$attr