XML::Parser
XML::Parser
|
|
[ home ]
-
[ search ]
-
[ sitemap ]
[ up ]
XML Input
<?xml version="1.0" encoding="ISO-8859-1" ?>
<PREPAID>
<EINZEL_REGISTRATION>
<MOBILE>0763009019</MOBILE>
<SALUTATION>Mr</SALUTATION>
<FIRSTNAME>Evelyne</FIRSTNAME>
<LASTNAME>Dindäö</LASTNAME>
<ADDR1>Hurstrasse 34</ADDR1>
<ADDR2 />
<POSTCODE>8046</POSTCODE>
<CITY>Zurich</CITY>
<ZUSATZ_X>wundertüte</ZUSATZ_X>
<ZUSATZ_SUB>
<SUB>foo</SUB>
</ZUSATZ_SUB>
<EMAIL>EvelyneDind@hotmail.com</EMAIL>
</EINZEL_REGISTRATION>
</PREPAID>
The Perl Script
#!/usr/bin/perl -w
use strict;
my $VERSION = '0.80.01';
use XML::Parser;
use Data::Dumper;
##### GLOBAL
my @xmlData = ();
my $xmlString = &slurpFile($ARGV[0]);
my @attributes = ();
$| = 1;
#####################################################################
## MAIN
#####################################################################
print qq~
===== Input ====================================================================
${$xmlString}
=========================================================================
~;
my $p1 = new XML::Parser(
Style => 'Tree'
);
my @result = $p1->parse( ${$xmlString} );
print "=> $result[0][0]\n";
print "==> $result[0][1][3]\n";
@xmlData = $result[0][1]; # first xml file
# XX my $d = Data::Dumper->new(@result); print $d->Dump();
my $counter = 0;
#--------- get attribute captions ---------#
# MOBILE <- 0 4 3
# SALUTATION <- 0 4 7
my $i = 0;
my $j = 4;
my $xmlRecordCntr = 0;
GETATTRS: while (1) {
$counter = 0;
$i = 3; while (1) {
last unless defined $xmlData[0][$j][$i];
$counter++;
push(@attributes, $xmlData[0][$j][$i]);
# XX print "----------->> [0][$j][$i] ", $xmlData[0][$j][$i], "\n";
$i += 4;
}
$i = 3; $j += 4;
$xmlRecordCntr++;
last GETATTRS unless defined $xmlData[0][$j][$i];
}
my $NR_OF_INNER_ATTRS = $counter; # e.g. <first>, <last> ...
my $nr_of_records = $counter / $NR_OF_INNER_ATTRS;
print "$xmlRecordCntr xml records found ($counter attrs)\n\n";
#--------- get attribute values ---------#
$counter = 0;
$j = 4;
for (my $loop = 0; $loop < $xmlRecordCntr; $loop++) {
$i = 4;
while (1) {
last if !(defined $xmlData[0][$j][$i][2]) && !(defined $xmlData[0][$j][$i + 4][2]);
my $captionIndex = $counter % $NR_OF_INNER_ATTRS;
print "-------------------------------\n" unless $captionIndex; # start of a XML rec
$xmlData[0][$j][$i][2] ||= '';
print $attributes[$captionIndex], ": \t", $xmlData[0][$j][$i][2], "\n";
$counter++;
$i += 4;
}
$j += 4;
}
########################################################################
sub slurpFile ($) {
########################################################################
local $/ = undef;
open(INCFILE, $_[0]) or print $!; my $data = <INCFILE>; close INCFILE;
\$data;
}
__END__
Output
=> PREPAID
==> EINZEL_REGISTRATION
1 xml records found (11 attrs)
-------------------------------
MOBILE: 0763009019
SALUTATION: Mr
FIRSTNAME: Evelyne
LASTNAME: Dindäö
ADDR1: Hurstrasse 34
ADDR2:
POSTCODE: 8046
CITY: Zurich
ZUSATZ_X: wundertüte
ZUSATZ_SUB:
EMAIL: EvelyneDind@hotmail.com
|