#!/usr/bin/env perl package PXP; sub new { my ($class)=@_; my %self={}; # Variables $self->{buf}=""; $self->{root}=""; $self->{tags}=(); $self->{attr}=(); $self->{body}=(); return bless \$self; } sub parse { my (%self)=@_; $msg=$self->{buf}; @ATTR=(); @TAGS=(); @BODY=(); $TAGS_i=0; $msg=~s/\n//g; $msg=~s///g; #Strip comments $msg=~s/<([^>]*)>/>/; $self->{root}=$1; $msg=~s/<\/([^<>]*)>/<\/\1>\n/g; while(1) { $msg=~/<(.*)>(.*)<\/.*>/; $tag=$1;chomp($tag); $body=$2; $BODY[$TAGS_i]=$body; if ($tag eq "") { last; } $tag=~/([^\ ]*)/; $name=$1; $TAGS[$TAGS_i]=$name; # Store tag $BODY[$TAGS_i]=$body; $TAGS_i++; while ($tag=~/=/) { $tag=~s/([^\ ]*)=\"([^\"]*)\"//; $ATTR[$ATTR_i]{$1}=$2; } chop($tag); $msg=~s/<.*>$body<\/.*>//; } ($self->{tags})=\@TAGS; ($self->{body})=\@BODY; ($self->{attr})=\@ATTR; } sub getAttributes { %self=shift; $i=shift; return %{$self->{attr}[$i]}; } sub getRoot { my (%self)=@_; return $self->{root}; } sub getTags { my (%self)=@_; return @{$self->{tags}}; } sub getBodies { my (%self)=@_; return @{$self->{body}}; } sub setBuffer { my (%self,$buf)=@_; bless($buf); $self->{buf}=$buf; } sub setBufferFromFile { my %self=shift; my $file=shift; my $buf; open(F,"<$file") or die "File '$file' not found"; while(){ $buf.=$_; } close(F); $self->{buf}=$buf; } 1; __END__ =head1 NAME PXP - A perl module for parsing XML documents (pancake xml parser) $pxp PXP->new(); $pxp->setBuffer($buf); $pxp->setBufferFromFile("filename"); print $pxp->getRoot()."\n"; for $tag (keys $pxp->getTags() ) { print "TAG $tag\n"; } $pxp->parse(); =cut