Mercurial > pub > Impl
view Lib/IMPL/DOM/XMLReader.pm @ 21:fafe56cfcd69
temp commit
author | Sergey |
---|---|
date | Wed, 30 Sep 2009 10:25:41 +0400 |
parents | 65a7bb156fb7 |
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