comparison Lib/IMPL/DOM/XMLReader.pm @ 37:c2e7f7c96bcd

performance improvements, DOM reworked (a little)
author Sergey
date Mon, 23 Nov 2009 00:59:06 +0300
parents 65a7bb156fb7
children 16ada169ca75
comparison
equal deleted inserted replaced
36:1828103371d0 37:c2e7f7c96bcd
10 __PACKAGE__->PassThroughArgs; 10 __PACKAGE__->PassThroughArgs;
11 11
12 BEGIN { 12 BEGIN {
13 public _direct property Navigator => prop_get | owner_set; 13 public _direct property Navigator => prop_get | owner_set;
14 private _direct property _current => prop_all; 14 private _direct property _current => prop_all;
15 private _direct property _text => prop_all;
16 private _direct property _textHistory => prop_all;
15 } 17 }
16 18
17 sub Parse { 19 sub Parse {
18 my ($this,$in) = @_; 20 my ($this,$in) = @_;
19 21
31 sub ParseFile { 33 sub ParseFile {
32 my ($this,$in) = @_; 34 my ($this,$in) = @_;
33 35
34 my $parser = new XML::Parser( 36 my $parser = new XML::Parser(
35 Handlers => { 37 Handlers => {
36 Start => sub {shift; goto &_OnStart($this,@_)}, 38 Start => sub {shift; unshift @_, $this; goto &_OnBegin;},
37 End => sub {shift; goto &_OnEnd($this,@_)}, 39 End => sub {shift; unshift @_, $this; goto &_OnEnd;},
38 Char => sub {shift; goto &_OnChar($this,@_)} 40 Char => sub {shift; unshift @_, $this; goto &_OnChar;}
39 } 41 }
40 ); 42 );
41 43
42 $parser->parsefile($in); 44 $parser->parsefile($in);
43 } 45 }
44 46
45 47
46 sub _OnBegin { 48 sub _OnBegin {
47 my ($this,$element,%attrs) = @_; 49 my ($this,$element,%attrs) = @_;
48 50
51 push @{$this->{$_textHistory}},$this->{$_text};
52 $this->{$_text} = "";
49 $this->{$_current} = $this->Navigator->NavigateCreate($element,%attrs); 53 $this->{$_current} = $this->Navigator->NavigateCreate($element,%attrs);
50 } 54 }
51 55
52 sub _OnEnd { 56 sub _OnEnd {
53 my ($this,$element) = @_; 57 my ($this,$element) = @_;
54 58
55 $this->{$_current} = $this->Back; 59 $this->{$_current}->nodeValue($this->{$_text}) if length $this->{$_text};
60 $this->{$_text} = pop @{$this->{$_textHistory}};
61 $this->{$_current} = $this->Navigator->Back;
56 } 62 }
57 63
58 sub _OnChar { 64 sub _OnChar {
59 my ($this,$val) = @_; 65 my ($this,$val) = @_;
60 66 $this->{$_text} .= $val;
61 $this->{$_current}->nodeValue($this->{$_current}->nodeValue . $val);
62 } 67 }
63 68
64 1; 69 1;
65 70
66 __END__ 71 __END__