in reply to Re^5: Compare 2 XML files
in thread Compare 2 XML files

I have gone through the perlfaq4 ,but I am really struggling to get the correct logic to compare two array reference and only display matching records... Its also says use of Hash, so do i need to change Hash ...as im already having array of hash.. please correct me ..
#!/usr/bin/env perl use strict; use warnings; use XML::XPath; use Data::Dumper; my @records; my @eventrecords; my $eventxml = 'events.xml'; my $evenxp = XML::XPath->new(filename => $eventxml); my $evennodeset = $evenxp->findnodes('//event'); my $xml = 'ApplicationList.xml'; my $xp = XML::XPath->new(filename => $xml); my $nodeset = $xp->findnodes('//application_list'); foreach my $evennode ($evennodeset->get_nodelist) { my $evenssrid = $evenxp->find("./custom_attribute_list/custom_ +attribute[normalize-space(name)='SSRID']/value", $evennode); s/^\s+|\s+$//g for $evenssrid; push @eventrecords, {eventid => $evenssrid}; } print Dumper \@eventrecords; foreach ($xp->findnodes('/application_list/application/@id') ) { my $appid = $_->string_value; $appid =~ s/^\s+|\s+$//g; push @records, {appid => $appid }; } print Dumper \@records;

Replies are listed 'Best First'.
Re^7: Compare 2 XML files
by poj (Abbot) on Jul 10, 2017 at 14:43 UTC
    so do i need to change Hash ?

    Yes, and parse the application ids first

    #!/usr/bin/env perl use strict; use warnings; use XML::XPath; use Data::Dumper; my $xml = 'ApplicationList.xml'; my $xp = XML::XPath->new(filename => $xml); my %appid = (); for ($xp->findnodes('/application_list/application/@id') ) { my $id = $_->string_value; $id =~ s/^\s+|\s+$//g; $appid{$id} = 1;; } print Dumper \%appid; my $eventxml = 'events.xml'; my $evenxp = XML::XPath->new(filename => $eventxml); my $xpath = "//event/custom_attribute_list/custom_attribute[normalize- +space(name)='SLB_SSRID']/value"; my @eventrecords = (); foreach my $node ($evenxp->findnodes($xpath)) { my $ssrid = $node->string_value; $ssrid =~ s/^\s+|\s+$//g ; if ( exists $appid{$ssrid} ){ push @eventrecords, { eventid => $ssrid }; } } print Dumper \@eventrecords;
    poj
      Brilliant @Poj - Thank you for helping ...
        Hello Poj, i have modify the code as below :
        my $xml = 'ApplicationList.xml'; my $xp = XML::XPath->new(filename => $xml); my $appxpath = $xp->findnodes("//application_list/application/"); my %appid = (); my %appname = (); foreach my $appnodeset ($appxpath->get_nodelist) { my $id = $xp->find('./@id',$appnodeset); my $name = $xp->find('./@name',$appnodeset); #$name = $_->string_value; s/^\s+|\s+$//g for $id,$name; $appid{$id} = {$name->string_value}; } print Dumper \%appid;
        But i am getting output as
        $VAR1 = { '1103' => { 'cccc' => undef }, '2667' => { 'bbbb' => undef }, '957' => { 'aaaa' => undef }, '1503' => { 'dddd' => undef } };
        But i want out put as
        $VAR1 = { '1103' => 'cccc', '2667' => 'bbbb', '957' => 'aaaa', '1503' => 'dddd' };
Re^7: Compare 2 XML files
by Corion (Patriarch) on Jul 10, 2017 at 13:50 UTC

    You have the "application" XML (the left side) and the event XML (the right side) in your comparison.

    You will need a hash to know whether an element is in the application XML array.

    For that, you initialize the hash using the application id as key and (say) the hash reference from the right side as the value.

    Then, for each event in the event array, you look in the application ID hash for the application id. If it exists, you have found a match.