Reputation: 9
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