***** infoCopter.com/perl *****
XML::ParserXML::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 |