Mercurial > pub > Impl
diff Lib/IMPL/DOM/XMLReader.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | c2e7f7c96bcd |
children | c289ed9662ca |
line wrap: on
line diff
--- a/Lib/IMPL/DOM/XMLReader.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/IMPL/DOM/XMLReader.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,105 +1,105 @@ -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; - private _direct property _text => prop_all; - private _direct property _textHistory => 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; unshift @_, $this; goto &_OnBegin;}, - End => sub {shift; unshift @_, $this; goto &_OnEnd;}, - Char => sub {shift; unshift @_, $this; goto &_OnChar;} - } - ); - - $parser->parsefile($in); -} - - -sub _OnBegin { - my ($this,$element,%attrs) = @_; - - push @{$this->{$_textHistory}},$this->{$_text}; - $this->{$_text} = ""; - $this->{$_current} = $this->Navigator->NavigateCreate($element,%attrs); -} - -sub _OnEnd { - my ($this,$element) = @_; - - $this->{$_current}->nodeValue($this->{$_text}) if length $this->{$_text}; - $this->{$_text} = pop @{$this->{$_textHistory}}; - $this->{$_current} = $this->Navigator->Back; -} - -sub _OnChar { - my ($this,$val) = @_; - $this->{$_text} .= $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 +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; + private _direct property _text => prop_all; + private _direct property _textHistory => 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; unshift @_, $this; goto &_OnBegin;}, + End => sub {shift; unshift @_, $this; goto &_OnEnd;}, + Char => sub {shift; unshift @_, $this; goto &_OnChar;} + } + ); + + $parser->parsefile($in); +} + + +sub _OnBegin { + my ($this,$element,%attrs) = @_; + + push @{$this->{$_textHistory}},$this->{$_text}; + $this->{$_text} = ""; + $this->{$_current} = $this->Navigator->NavigateCreate($element,%attrs); +} + +sub _OnEnd { + my ($this,$element) = @_; + + $this->{$_current}->nodeValue($this->{$_text}) if length $this->{$_text}; + $this->{$_text} = pop @{$this->{$_textHistory}}; + $this->{$_current} = $this->Navigator->Back; +} + +sub _OnChar { + my ($this,$val) = @_; + $this->{$_text} .= $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