<: # # perl -w -MXML::Parser -MData::Dumper -e '$p=new XML::Parser(Style => 'Tree'); # $tree=$p->parsestring("Hello");print Dumper($tree);' sub parse_xmlfile { my $fname = shift; my $entity; # Current entity name my %entity; # Hash of lists my $list; # Reference to List of entries my $entry; # Reference to Each read entry my $sort = ''; # Sort-criteria my %tmp; my $elem; my %elm; open (S, "$fname"); while () { #next if (/^#/); #next if (/^\s*$/); if (//) { $entity = $1; $sort = $2; $list = []; } elsif (//) { $entity = $1; $list = []; } elsif (/<\/entity>/) { if ($sort) { %tmp = (); foreach $elem (@$list) { %elm = %{$elem}; if (length ($elm{$sort}) > 0) { $tmp{$elm{$sort}} = $elem; } else { $tmp{"x"x100} = $elem; } } @$list = (); foreach $elem (sort keys %tmp) { push (@$list, $tmp{$elem}); } } $entity{$entity} = $list; } elsif (//) { $entry = {}; } elsif (/<\/entry>/) { # $list[$#list+1] = \%entry; push (@$list, $entry); } elsif (/^\s*(\S+):\s*(.*)$/) { $$entry{$1} = $2; } } close (S); return %entity; } # Zum Lesen & verarbeiten: # # %data = parse_xmlfile ("search.xml"); # # foreach $i (keys %data) { # printf "%s\n", $i; # $list = $data{$i}; # @list = @$list; # %entry = %{$slist[$i]}; # foreach $k (@list) { # %entry = %$k; # foreach $j (keys %entry) { # printf " %s: %s\n", $j, $entry{$j}; # } # print "\n"; # } # } :>