The problem is probably that XML::Parser is an
object factory: it generates XML::Parser::Expat
objects with each parse or parsefile
call. The handlers then receive XML::Parser::Expat
objects and not XML::Parser objects.
There is a way to store data in the XML::Parser
object and to access it in the handlers though:
use the 'Non-Expat-Options' argument when creating
the XML::Parser:
#!/bin/perl -w
use strict;
use XML::Parser;
my $p= new XML::Parser(
'Non-Expat-Options' => { my_option => "toto" },
Handlers => { Start => \&start, }
);
$p->parse( '<a />');
sub start
{ my( $pe, $elt, %atts)= @_;
print "my option: ", $pe->{'Non-Expat-Options'}->{my_option}, "\n"
+;
}
This is certainly ugly but it works!
Update: note that the data is still stored in the
XML::Parser object though, as shown by this code:
#!/bin/perl -w
use strict;
use XML::Parser;
my $p= new XML::Parser(
'Non-Expat-Options' => { my_option => "1" },
Handlers => { Start => \&start, }
);
$p->parse( '<a />');
$p->parse( '<b />');
sub start
{ my( $pe, $elt, %atts)= @_;
print "element: $elt - my option: ",
$pe->{'Non-Expat-Options'}->{my_option}++, "\n";
$p->parse( '<c />')
unless( $pe->{'Non-Expat-Options'}->{my_option} > 3);
}
Which outputs:
element: a - my option: 1
element: c - my option: 2
element: c - my option: 3
element: b - my option: 4
|