view Lib/IMPL/DOM/XMLReader.pm @ 14:65a7bb156fb7

Дом модель и схема
author Sergey
date Fri, 04 Sep 2009 16:38:15 +0400
parents bb8d67f811ea
children c2e7f7c96bcd
line wrap: on
line source

package IMPL::DOM::XMLReader;
use strict;
use warnings;

use base qw(IMPL::Object IMPL::Object::Autofill);
use IMPL::Class::Property;
use IMPL::Class::Property::Direct;
use XML::Parser;

__PACKAGE__->PassThroughArgs;

BEGIN {
    public _direct property Navigator => prop_get | owner_set;
    private _direct property _current => prop_all;
}

sub Parse {
    my ($this,$in) = @_;
    
    my $parser = new XML::Parser(
        Handlers => {
            Start => sub {shift; goto &OnStart($this,@_)},
            End => sub {shift; goto &OnEnd($this,@_)},
            Char => sub {shift; goto &OnChar($this,@_)}
        }
    );
    
    $parser->parse($in);
}

sub ParseFile {
    my ($this,$in) = @_;
    
    my $parser = new XML::Parser(
        Handlers => {
            Start => sub {shift; goto &_OnStart($this,@_)},
            End => sub {shift; goto &_OnEnd($this,@_)},
            Char => sub {shift; goto &_OnChar($this,@_)}
        }
    );
    
    $parser->parsefile($in);
}


sub _OnBegin {
    my ($this,$element,%attrs) = @_;
    
    $this->{$_current} = $this->Navigator->NavigateCreate($element,%attrs);
}

sub _OnEnd {
    my ($this,$element) = @_;
    
    $this->{$_current} = $this->Back;
}

sub _OnChar {
    my ($this,$val) = @_;
    
    $this->{$_current}->nodeValue($this->{$_current}->nodeValue . $val);
}

1;

__END__

=pod

=head1 SYNOPSIS

my $reader = new IMPL::DOM::XMLReader(Navigator => $DomBuilder);
my $obj = $reader->parsefile("data.xml");

=head1 DESCRIPTION

 ,     .   
      .

    C<NavigateCreate>  C<Back>

=head1 METHODS

=over

=item C<CTOR(Naviagtor => $builder)>

   ,      

=item C<$obj->Parse($in)>

 .     xml ,  HANDLE.

=item C<$obj->ParseFile($fileName)>

      C<$fileName>.

=back

=cut