XML als Objekte parsen
Für ein aktuelles Projekt benötge ich einen Parsebaum aus XML-Dokumenten, der aus Objekten besteht. Ich bin sicher, daß schon mal so oder ähnlich jemand gemacht hat. Leider ist CPAN mittlerweile recht groß…
Meine Vorstellung ist, daß der Tagname der Klassenname des Objektes wird. Zu diesem Zweck muss der etwas gewöhnungsbedürftige Output von XML::Parser transformiert werden. Die Objekte sollen Hashes sein mit den Einträgen “attr” und “data”. “attr” soll seinerseits ein hash der Attributwerte sein und data ein array mit den Sub-Objekten.
Los gehts:
package main; use XML::Parser; use Data::Dumper; my $p = new XML::Parser(Style => 'Tree'); my $t= $p->parse('<html htmlattr1="xx"> <head headattr1="a" headattr2="b"><title>test</title></head> <body> <div style="color:red">murx</div> </body> </html>'); print Dumper($t); sub transform { my ($tag,$content) = @_; return $content unless $tag; my @content = @$content; #kopie! my $attr = shift @content; my %attr = %$attr; #kopie! # an dieser stelle haben wir mit $tag, %attr und @content eine # repräsentation des aktuellen tags my @tags; while (@content) { my $t = shift @content; my $c = shift @content; push @tags, transform($t,$c); } my $obj={ attr => \%attr, data => \@tags, }; return bless $obj,$tag; } my $objtree = transform(@$t->[0], $t->[1]); print Dumper($objtree);
