Mercurial > pub > Impl
diff Lib/IMPL/DOM/XMLReader.pm @ 10:63f6653b094e
DOM
author | Sergey |
---|---|
date | Fri, 28 Aug 2009 16:26:20 +0400 |
parents | |
children | 75980091813b 955b2324c1bf |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/DOM/XMLReader.pm Fri Aug 28 16:26:20 2009 +0400 @@ -0,0 +1,47 @@ +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; + +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 OnBegin { + my ($this,$element,%attrs) = @_; + + $this->{$_current} = $this->Navigator->CreateAndNavigate($element,%attrs); +} + +sub OnEnd { + my ($this,$element) = @_; + + $this->{$_current} = $this->Back; +} + +sub OnChar { + my ($this,$val) = @_; + + $this->{$_current}->nodeValue($this->{$_current}->nodeValue . $val); +} + +1;