sannag has asked for the wisdom of the Perl Monks concerning the following question:
I am relative new to Perl. Please check to see what I am doing wrong.
I have following input tab delimited file, which need to be built to XML, 'pin'number is the unique identifier. If the 'Pin' matches then populate show multiple 'CHARGE' under the report.
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
I want it to build following XML
<XML_FILE> <REPORT TYPE="AB"> <REASON1>data1</REASON> <REASON2>data2</REASON2> <REASON3>data3</REASON3> <PERSON> <PIN>Pin 1</PIN> <NAME>data5</NAME> <ZIP>data6<ZIP> </PERSON> <CHARGE> <DATE>data7</DATE> <TIME>data8</TIME> </CHARGE> <CHARGE> <DATE>data9</DATE> <TIME>data10<TIME> </CHARGE> <CHARGE> <DATE>data11</DATE> <TIME>data12</TIME> </CHARGE> </REPORT> </XML_FILE>
Below is the code I have
The output I get is, basically only the first 'CHARGE' is showing up not the other two.use strict; use XML::LibXML; my $READFILENAME = "SomeDir\\data.txt"; my $WRITEFILENAME = "SomeDir\\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"; foreach (<READFILE>) { my $line = $_; 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"); if ($person_pin ne $copy_person_pin) { # Build the Report tags # I had to put $report out of if loop so that $report is avalibl +e in else statement # my $report = $doc->createElement("REPORT"); $report->setAttribute('TYPE'=>'AB'); 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 ); # Build the elements for Charge Tag + buildXMLElements(\@sortedChargeTag, \%chargeHashTags, $charge); $report-> appendChild($charge); $copy_person_pin = $person_pin; } else { 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); } } $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); } }
<XML_FILE> <REPORT TYPE="AB"> <REASON1>data1</REASON> <REASON2>data2</REASON2> <REASON3>data3</REASON3> <PERSON> <PIN>Pin 1</PIN> <NAME>data5</NAME> <ZIP>data6<ZIP> </PERSON> <CHARGE> <DATE>data7</DATE> <TIME>data8</TIME> </CHARGE> </REPORT> </XML_FILE>
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Building XML with tab delimited
by kcott (Archbishop) on Aug 11, 2016 at 08:43 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 15:45 UTC | |
by kcott (Archbishop) on Aug 11, 2016 at 21:25 UTC | |
by sannag (Sexton) on Aug 12, 2016 at 02:04 UTC | |
by robby_dobby (Hermit) on Aug 11, 2016 at 15:48 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 20:44 UTC | |
|
Re: Building XML with tab delimited
by choroba (Cardinal) on Aug 11, 2016 at 00:21 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 02:49 UTC | |
by Cow1337killr (Monk) on Aug 13, 2016 at 04:04 UTC | |
|
Re: Building XML with tab delimited
by Marshall (Canon) on Aug 11, 2016 at 04:18 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 04:32 UTC | |
by Marshall (Canon) on Aug 11, 2016 at 04:41 UTC | |
by robby_dobby (Hermit) on Aug 11, 2016 at 05:02 UTC | |
|
Re: Building XML with tab delimited
by Anonymous Monk on Aug 11, 2016 at 03:34 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 04:23 UTC | |
by AnomalousMonk (Archbishop) on Aug 11, 2016 at 12:50 UTC | |
by sannag (Sexton) on Aug 11, 2016 at 14:35 UTC |