#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML::Reader;
use Data::Dumper;
my $hash_ref;
my $reader = XML::LibXML::Reader->new( IO => *DATA );
while ( $reader->nextElement( 'Service' )) {
my $number = $reader->getAttribute( 'Num');
$hash_ref->{$number} = [];
$reader->read;
while (1) {
if ( $reader->localName eq 'Customermodules'
or $reader->localName eq 'Suppliermodules')
{
$reader->read;
while (1) {
if ($reader->localName eq 'Softwaremodule') {
my $module = {};
$module->{Service} = $reader->getAttribute('Service');
$module->{path} = $reader->getAttribute('Path');
push @{$hash_ref->{$number}}, $module;
} elsif ($reader->localName eq 'Hardwaremodule') {
my $module = {};
$module->{Type} = $reader->getAttribute('Type');
$module->{Nr} = $reader->getAttribute('Nr');
$module->{Servicenum} = $reader->getAttribute('Servicenum');
$module->{path} = $reader->getAttribute('Path');
push @{$hash_ref->{$number}}, $module;
}
$reader->nextSibling() > 0 or last;
}
}
$reader->nextSibling() > 0 or last;
}
}
$reader->finish;
print Dumper $hash_ref;
__DATA__
It delivers actual temperature in the form ov Volts
####
$VAR1 = {
'B7a' => [
{
'path' => '/main/ADCservice.xml',
'Service' => 'ADC'
},
{
'path' => '/main/inputservice.xml',
'Service' => 'input'
},
{
'path' => '/main/signalservice.xml',
'Service' => 'signal'
},
{
'Type' => 'engine',
'Servicenum' => '1',
'path' => '/main/engineservice.xml',
'Nr' => '18'
},
{
'Type' => 'motor',
'Servicenum' => '1',
'path' => '/main/motorservice.xml',
'Nr' => '7'
},
{
'Type' => 'supply',
'Servicenum' => '1',
'path' => '/main/supplyservice.xml',
'Nr' => '1'
}
]
};