***** infoCopter.com/perl *****

XML::Parser

XML::Parser

[ 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
© reto :)