<?xml version="1.0" encoding="windows-1252"?>
<node id="62786" title="Re: Re: XML::Parser Tutorial" created="2001-03-07 16:29:26" updated="2005-08-06 09:24:03">
<type id="11">
note</type>
<author id="9346">
mirod</author>
<data>
<field name="doctext">
&lt;p&gt;The problem is probably that XML::Parser is an
   &lt;i&gt;object factory&lt;/i&gt;: it generates XML::Parser::Expat
   objects with each &lt;tt&gt;parse&lt;/tt&gt; or &lt;tt&gt;parsefile&lt;/tt&gt;
   call. The handlers then receive XML::Parser::Expat
   objects and not XML::Parser objects.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;code&gt;#!/bin/perl -w
use strict;
use XML::Parser;

my $p= new XML::Parser(
        'Non-Expat-Options' =&gt; { my_option =&gt; "toto" },
        Handlers =&gt; { Start =&gt; \&amp;start, }
                      );
$p-&gt;parse( '&lt;a /&gt;');

sub start
  { my( $pe, $elt, %atts)= @_;
    print "my option: ", $pe-&gt;{'Non-Expat-Options'}-&gt;{my_option}, "\n";
  }
&lt;/code&gt;
&lt;p&gt;This is certainly ugly but it works!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; note that the data is still stored in the
   XML::Parser object though, as shown by this code:&lt;/p&gt;
&lt;code&gt;#!/bin/perl -w
use strict;
use XML::Parser;

my $p= new XML::Parser(
        'Non-Expat-Options' =&gt; { my_option =&gt; "1" },
        Handlers =&gt; { Start =&gt; \&amp;start, }
                      );
$p-&gt;parse( '&lt;a /&gt;');
$p-&gt;parse( '&lt;b /&gt;');

sub start
  { my( $pe, $elt, %atts)= @_;
    print "element: $elt - my option: ", 
          $pe-&gt;{'Non-Expat-Options'}-&gt;{my_option}++, "\n";
    $p-&gt;parse( '&lt;c /&gt;') 
       unless( $pe-&gt;{'Non-Expat-Options'}-&gt;{my_option} &gt; 3);
  }&lt;/code&gt;
&lt;p&gt;Which outputs:&lt;/p&gt;
&lt;code&gt;element: a - my option: 1
element: c - my option: 2
element: c - my option: 3
element: b - my option: 4  &lt;/code&gt;</field>
<field name="root_node">
62782</field>
<field name="parent_node">
62784</field>
</data>
</node>
