[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