I do not have a solution, but I have some suggestions that may help.
- I reformatted the code to a more consistent indentation style. You can use a different one, but consistency helps me in the understanding.
- I converted the code to use the DATA segment for reading instead of an input file.
- I added "use warnings;" this showed a number of issues. You need to skip these first 2 lines of the input file. Use of prototypes, e.g.sub buildXMLElements() {} should just be sub buildXMLElements {}. However this is not the main problem.
- I added in some print statements that may help somebody else figure out what the problem is. I don't see it at the moment.
My code produces the output to STDERR:
pin not equal
appending first Charge
<REPORT TYPE="AB"><REASON1>data1</REASON1><REASON2>data2</REASON2><REA
+SON3>data3</REASON3><PERSON><PIN>Pin 1</PIN><NAME>data5</NAME><ZIP>da
+ta6</ZIP></PERSON><CHARGE><DATE>data7</DATE><TIME>data8</TIME></CHARG
+E></REPORT>
pin equal
<REPORT TYPE="AB"><CHARGE><DATE>data9</DATE><TIME>data10</TIME></CHARG
+E></REPORT>
appending a Charge
pin equal
<REPORT TYPE="AB"><CHARGE><DATE>data11</DATE><TIME>data12</TIME></CHAR
+GE></REPORT>
appending a Charge
writing document
Process completed successfully
And output file:
<?xml version="1.0"?>
<XML_FILE><REPORT TYPE="AB"><REASON1>data1</REASON1><REASON2>data2</RE
+ASON2><REASON3>data3</REASON3><PERSON><PIN>Pin 1</PIN><NAME>data5</NA
+ME><ZIP>data6</ZIP></PERSON><CHARGE><DATE>data7</DATE><TIME>data8</TI
+ME></CHARGE></REPORT></XML_FILE>
reformatted code:
use strict;
use warnings;
use Data::Dumper;
use XML::LibXML;
#my $READFILENAME = "SomeDir\\data.txt";
my $WRITEFILENAME = "test.xml";
my $doc = XML::LibXML::Document->new('1.0');
my $root = $doc->createElement("XML_FILE");
open (FILEWRITE, ">$WRITEFILENAME");
# open (READFILE, $READFILENAME);
my $copy_person_pin = "XX";
<DATA>;<DATA>; ############################
while (my $line = <DATA>)
{
chomp $line;
my @data = split(/\t/,$line);
my $reason1 = $data[0];
my $reason2 = $data[1];
my $reason3 = $data[2];
my $person_pin = $data[3];
my $name = $data[4];
my $zip = $data[5];
my $date = $data[6];
my $time = $data[7];
my $report = $doc->createElement("REPORT");
$report->setAttribute('TYPE'=>'AB');
if ($person_pin ne $copy_person_pin)
{
# Build the Report tags
my @sortedReportTag = qw ( REASON1 REASON2 REASON3);
my %reportHashTags;
@reportHashTags { @sortedReportTag } = ($reason1,
$reason2,
$reason3
);
+
buildXMLElements(\@sortedReportTag, \%reportHashTags, $report);
+
$root-> appendChild($report);
# Build the element for Person Tag
my $person = $doc->createElement("PERSON");
my @sortedPersonTag = qw ( PIN
NAME
ZIP);
my %personHashTags;
@personHashTags { @sortedPersonTag } = ($person_pin,
$name,
$zip
);
# Build the elements for Person Tag
buildXMLElements(\@sortedPersonTag, \%personHashTags, $person);
$report-> appendChild($person);
# Build the elements for Charge Tag
my $charge = $doc->createElement("CHARGE");
my @sortedChargeTag = qw ( DATE
TIME
);
my %chargeHashTags;
@chargeHashTags { @sortedChargeTag } = ($date,
$time
);
buildXMLElements(\@sortedChargeTag, \%chargeHashTags, $charge);
$report-> appendChild($charge);
$copy_person_pin = $person_pin;
print STDERR "pin not equal\n";
print STDERR "appending first Charge\n";
print STDERR $report->toString(),"\n"; # returns a character string
}
else
{
print STDERR "pin equal\n";
my $charge = $doc->createElement("CHARGE");
my @sortedChargeTag = qw ( DATE
TIME
);
my %chargeHashTags;
@chargeHashTags { @sortedChargeTag } = ($date,
$time
);
# Build the elements for Charge Tag
+
buildXMLElements(\@sortedChargeTag, \%chargeHashTags, $charge);
$report-> appendChild($charge);
print STDERR $report->toString(),"\n"; # returns a character string
+
print STDERR "appending a Charge\n";
}
}
print STDERR "writing document\n";
$doc->setDocumentElement($root);
# Write the XML to a file
print FILEWRITE ($doc->toString());
close FILEWRITE;
sub buildXMLElements
{
my($elementTags, $hashTags, $parentElement) = @_;
for my $name (@$elementTags)
{
my $reportTag = $doc->createElement($name);
my $reportValue = $hashTags->{$name};
$reportTag->appendTextNode($reportValue);
$parentElement->appendChild($reportTag);
}
}
__DATA__
Reason1 Reason2 Reason3 Pin Name Zip Date Time
data1 data2 data3 Pin 1 data5 data6 data7 data8
data1 data2 data3 Pin 1 data5 data6 data9 data10
data1 data2 data3 Pin 1 data5 data6 data11 data12