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;