[bcn-pm] XML nyaju (2)

pancake pancake at phreaker.net
Fri Jun 4 07:01:53 CDT 2004


Aixo d'estar en epoca d'exams m'obliga a sudar d'estudiar. aqi teniu la api OO per accedir al parseig del XML q vaig enviar ahir.

el passar-ho a OO es 1ms més lent en el p4m 1.7. pero bueno. es mes practic ;)

espero q a més d'algu li serveixi per si ha de fer algo semblant, per cert, si algu es curra per poder suportar tags aniuats q m'envii el .diff o ho comentem per aqi la llista. si us mireu el codi del PXP.pm veureu que lq he fet basicament es anar enllaçant amb rerefencies internes a la hash self del objecte les arrays de cada element amb els hash i escalars.

inga bon profit! =)

aqi esta el codi q l'utilitza, pq veieu com s'utilitza l'api.

[0:~/prg/xml]$ cat pxp.pl 
use PXP;

$pxp=PXP->new();
$pxp->setBufferFromFile("side.xml");
$pxp->parse();

print "ROOT TAG IS : '".$pxp->getRoot()."'\n";

@tags=$pxp->getTags();
@body=$pxp->getBodies();

foreach $i ( 0..$#tags )
{
        print "$i) TAG: ".$tags[$i]." ( ".$body[$i]." )\n";
        %attr=$pxp->getAttributes($i);
        foreach $a (keys %attr)
        {
                print "ATTR $a=".$attr{$a}."\n";
        }
}
[0:~/prg/xml]$ 


PD::::___::::DP

ja veig q la llista capa els mails amb fitxers adjunts...viam si ho canvieu, pq amb el mutt no hi ha manera d'enviar els mails a la llista. torno a enviar en plain tot.

#!/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(<F>){ $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





More information about the Barcelona-pm mailing list