Mercurial > pub > Impl
comparison Lib/IMPL/DOM/XMLReader.pm @ 10:63f6653b094e
DOM
| author | Sergey |
|---|---|
| date | Fri, 28 Aug 2009 16:26:20 +0400 |
| parents | |
| children | 75980091813b 955b2324c1bf |
comparison
equal
deleted
inserted
replaced
| 9:5899df8c289e | 10:63f6653b094e |
|---|---|
| 1 package IMPL::DOM::XMLReader; | |
| 2 use strict; | |
| 3 use warnings; | |
| 4 | |
| 5 use base qw(IMPL::Object IMPL::Object::Autofill); | |
| 6 use IMPL::Class::Property; | |
| 7 use IMPL::Class::Property::Direct; | |
| 8 use XML::Parser; | |
| 9 | |
| 10 BEGIN { | |
| 11 public _direct property Navigator => prop_get | owner_set; | |
| 12 private _direct property _current => prop_all; | |
| 13 } | |
| 14 | |
| 15 sub Parse { | |
| 16 my ($this,$in) = @_; | |
| 17 | |
| 18 my $parser = new XML::Parser( | |
| 19 Handlers => { | |
| 20 Start => sub {shift; goto &OnStart($this,@_)}, | |
| 21 End => sub {shift; goto &OnEnd($this,@_)}, | |
| 22 Char => sub {shift; goto &OnChar($this,@_)} | |
| 23 } | |
| 24 ); | |
| 25 | |
| 26 $parser->parse($in); | |
| 27 } | |
| 28 | |
| 29 sub OnBegin { | |
| 30 my ($this,$element,%attrs) = @_; | |
| 31 | |
| 32 $this->{$_current} = $this->Navigator->CreateAndNavigate($element,%attrs); | |
| 33 } | |
| 34 | |
| 35 sub OnEnd { | |
| 36 my ($this,$element) = @_; | |
| 37 | |
| 38 $this->{$_current} = $this->Back; | |
| 39 } | |
| 40 | |
| 41 sub OnChar { | |
| 42 my ($this,$val) = @_; | |
| 43 | |
| 44 $this->{$_current}->nodeValue($this->{$_current}->nodeValue . $val); | |
| 45 } | |
| 46 | |
| 47 1; |
