user1883796
user1883796

Reputation: 9

XML::Twig accessing previous nodes

I have to update an email address tag in an xml file based on another input text file which contains email and account number. I am trying to traverse and get the account number and check if the account number is available in the text file and accordingly update the email address.

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;
use Data::Dumper;
use Time::Piece;

my $argc;
my $SourceFile1;   
my $OutputFile1;  
my $eConsentFile;  
my $fp;
my @fileType;
my $fileType1;
my $reference;
my $SCMAT;
my $m;
my $account;
my $email;
my %hash="";
my $INF1="";
my $orig_emailID="";
my $str="";
my $emailID="";
my $AccountNumber="";
my $count=0;
my $orig_maturityDate="";
my $maturityDate="";

 $argc = @ARGV;
   if ($argc < 3 ) { print "less arguments" ; }
   
   $SourceFile1 = $ARGV[0];   
   $eConsentFile = $ARGV[1];
   $OutputFile1 = $ARGV[2];
   open (INFILE1, "$eConsentFile")  or &dienice("Couldn't open input file1: $!");
   open ($fp, ">$OutputFile1")  or say("Couldn't open output file1: $!");
   @fileType = split('_',$SourceFile1); 
   $fileType1=$fileType[1];
   print "filetype: $fileType[1]\n";
   ProcessRecords(); 
  $m=XML::Twig->new( twig_handlers => { CUNoticeHeader => sub { $_->delete() },
                                   SCMAT => \&editTag ,                                
                                   NoticeDate => sub { $_->set_tag( 'DR3_NoticeDate')},                                
                                   'SCMAT/MemberInformation/AccountNumber' => sub { $_->set_tag( 'DR4_AccountNumber')},
                                   'SCMAT/MemberInformation/AddressLine1' => sub { $_->set_tag( 'DR11_AddressLine1')},
                                   'SCMAT/MemberInformation/City' => sub { $_->set_tag( 'DR13_City')},
                                   'SCMAT/MemberInformation/EmailAddress' => \&emailTag,
                                   'SCMAT/MemberInformation/PrimaryName' => sub { $_->set_tag( 'DR8_PrimaryName')},
                                   'SCMAT/MemberInformation/IsBadAddress' => sub { $_->set_tag( 'DR19_IsBadAddress')},
                                   'SCMAT/MemberInformation/IsENotice' => sub { $_->set_tag( 'DR20_IsENotice')},
                                   'SCMAT/MemberInformation/IsForeignAddress' => sub { $_->set_tag( 'DR21_IsForeignAddress')},
                                   'SCMAT/MemberInformation/IsNoMail' => sub { $_->set_tag( 'DR22_IsNoMail')},
                                   'SCMAT/MemberInformation/MaskedAccountNumber' => sub { $_->set_tag( 'DR7_MaskedAccountNumber')},
                                   'SCMAT/MemberInformation/PostalCode' => sub { $_->set_tag( 'DR15_PostalCode')},
                                   'SCMAT/MemberInformation/State' => sub { $_->set_tag( 'DR14_State')},
                                   'SCMAT/MemberInformation/Suffix' => sub { $_->set_tag( 'DR6_SuffixType')},
                                   'SCMAT/MemberInformation/SuffixType' => sub { $_->set_tag( 'DR5_Suffix')},                                  
                                   PrintMethod => sub { $_->set_tag( 'DI1_PrintMethod')},
                                   Balance => sub { $_->set_tag( 'DI2_Balance')},
                                   CertificateDescription => sub { $_->set_tag( 'DI3_CertificateDescription')},
                                   'SCMAT/CertificateInformation/AutoRenewalFlag' => sub { $_->set_tag( 'DI4_AutoRenewalFlag')},
                                   'SCMAT/CertificateInformation/IsBeforeOrAfterMaturity' => sub { $_->set_tag( 'DI5_IsBeforeOrAfterMaturity')},
                                   'SCMAT/CertificateInformation/CompoundingFrequency' => sub { $_->set_tag( 'DI7_CompoundingFrequency')},
                                   'SCMAT/CertificateInformation/DaysInYear' => sub { $_->set_tag( 'DI8_DaysInYear')},                                 
                                   'SCMAT/CertificateInformation/DividendMethod' => sub { $_->set_tag( 'DI9_DividendMethod')},
                                   'SCMAT/CertificateInformation/MaturityDate' => \&mdateTag ,
                                   'SCMAT/CertificateInformation/MinimumBalanceForDividends' => sub { $_->set_tag( 'DI11_MinimumBalanceForDividends')},
                                   'SCMAT/CertificateInformation/MinimumOpeningBalance' => sub { $_->set_tag( 'DI12_MinimumOpeningBalance')},
                                   'SCMAT/CertificateInformation/PenaltyDays' => sub { $_->set_tag( 'DI13_PenaltyDays')},                                  
                                   'SCMAT/CertificateInformation/PostingFrequency' => sub { $_->set_tag( 'DI14_PostingFrequency')},
                                   'SCMAT/CertificateInformation/Term' => sub { $_->set_tag( 'DI16_Term')},                                
                                    DateCertificateIssued => sub { $_->set_tag( 'DI17_DateCertificateIssued')},                                 
                                   'SCMAT/InterestRateData/InterestRateTier/APY' => sub { $_->set_tag( 'DI19_APY')},
                                   'SCMAT/InterestRateData/InterestRateTier/FromBalance' => sub { $_->set_tag( 'DI20_FromBalance')},
                                   'SCMAT/InterestRateData/InterestRateTier/Rate' => sub { $_->set_tag( 'DI22_Rate')},
                                   'SCMAT/InterestRateData/InterestRateTier/ToBalance' => sub { $_->set_tag( 'DI24_ToBalance')},
                                   'SCMAT/InterestRateData/RateMethod' => sub { $_->set_tag( 'DI26_RateMethod')},
                                   'SCMAT/InterestRateData/Type' => sub { $_->set_tag( 'DI27_Type')},
                                   IsIRA => sub { $_->set_tag( 'DI28_IsIRA')},
                                   IsRenewable => sub { $_->set_tag( 'DI29_IsRenewable')},
                                   'SCMAT/Messages/MessageType' => sub { $_->set_tag( 'DI30_MessageType')},
                                   'SCMAT/Messages/Message' => sub { $_->set_tag( 'DI31_Message')},                                   
                                   CUNoticeTrailer => sub { $_->delete() }, 
                                 },
                pretty_print => 'indented',
              )
         ->parsefile($SourceFile1)
         ->print($fp);
         
        

sub editTag {
    my ($t, $SCMAT) = @_;   
    $SCMAT=$_->del_att( 'xmlns' ); 
    $SCMAT->set_tag( 'New_Record');
    foreach ($SCMAT){
        $count++;
    }
    $SCMAT->insert_new_elt( first_child => 'DR2_RRD_Unique_ID' )->set_text(sprintf( "%08d", $count ));
    $SCMAT->insert_new_elt( first_child => 'DR1_Letter_Type' )->set_text($fileType1);
    $SCMAT->insert_new_elt( last_child =>'PRINT_TYPE' )->set_text('P'); 
    #$SCMAT->insert_new_elt( 'DR2_RRD_Unique_ID' );
    
    #my $ID= new XML::Twig::Elt( 'DR2_RRD_Unique_ID');        
    #$ID->paste( 'last_child','DR1_Letter_Type')->set_text(sprintf( "%08d", $count ));                            
    #$SCMAT->insert_new_elt( second_child =>'DR2_RRD_Unique_ID' )->set_text(sprintf( "%08d", $count )); 
}
sub mdateTag {
    my ($t, $maturityDate) = @_;    
    
    $maturityDate->set_tag( 'DI10_MaturityDate');
    $orig_maturityDate= $maturityDate->text;    
    $maturityDate->set_text(Time::Piece->strptime($orig_maturityDate, '%Y-%m-%d')->strftime('%m/%d/%Y'));   
}
sub emailTag {
    my ($t, $emailID) = @_;     
    $emailID->set_tag( 'DR18_EmailAddress');   
    $orig_emailID= $emailID->text;  
    print "orig_emailID: $orig_emailID \n"; 
    $AccountNumber = $emailID->prev_sibling('AccountNumber')->text;
    print "AccountNumber: $AccountNumber \n";
    if (exists $hash{$AccountNumber})
    {
    $str=$hash{$AccountNumber};
    $emailID->set_text($str); 
    }
    else {
        $emailID->set_text($orig_emailID); 
    }
    
    #$SCMAT->insert_new_elt( 'DR2_RRD_Unique_ID' );
}

sub ProcessRecords
       {
        while (!(eof(INFILE1)))
        {
         $INF1= <INFILE1>;
         my ($account, $email) = split(/\|/,$INF1);      
        $hash{$account} = $email;        
        }       
    #print Dumper(\%hash);  
        
    }

In the emailTag sub, I am trying to traverse and get the account number, but it keeps throwing an error:

Can't call method "text" on an undefined value.

I want to know how do I access the AccountNumber tag and its contents.

Upvotes: 0

Views: 49

Answers (0)

Related Questions