Mercurial > pub > Impl
comparison Lib/IMPL/DOM/Navigator/Builder.pm @ 15:16795016e70b
Dom schema in progress
author | Sergey |
---|---|
date | Mon, 07 Sep 2009 17:30:55 +0400 |
parents | 65a7bb156fb7 |
children | 75d55f4ee263 |
comparison
equal
deleted
inserted
replaced
14:65a7bb156fb7 | 15:16795016e70b |
---|---|
9 BEGIN { | 9 BEGIN { |
10 protected _direct property _navigatorSchema => prop_all; | 10 protected _direct property _navigatorSchema => prop_all; |
11 public _direct property Document => prop_get | owner_set; | 11 public _direct property Document => prop_get | owner_set; |
12 } | 12 } |
13 | 13 |
14 __PACKAGE__->PassThroughArgs; | 14 our %CTOR = ( |
15 'IMPL::DOM::Navigator' => sub { $_[0] } # IMPL::DOM::Navigator($domDocument) | |
16 ); | |
15 | 17 |
16 sub CTOR { | 18 sub CTOR { |
17 my ($this,$domDocument,$schema) = @_; | 19 my ($this,$domDocument,$schema) = @_; |
18 | 20 |
19 $this->{$Document} = $domDocument; | 21 $this->{$Document} = $domDocument; |
22 | 24 |
23 sub NavigateCreate { | 25 sub NavigateCreate { |
24 my ($this,$nodeName,%props) = @_; | 26 my ($this,$nodeName,%props) = @_; |
25 | 27 |
26 if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) { | 28 if ( my $nodeSchema = $this->{$_navigatorSchema}->Navigate(sub { $_[0]->nodeName eq $nodeName or $_[0]->isa('IMPL::DOM::Schema::AnyNode') }) ) { |
27 my $class = $nodeSchema->type; | 29 my $class = delete $props{type} || $nodeSchema->type || $nodeName; |
28 | 30 |
29 my $node = $this->{$Document}->Create($nodeName, $class, \%props); | 31 my $node = $this->{$Document}->Create(delete $props{nodeName} || $nodeName, $class, \%props); |
30 | 32 |
31 $this->Current()->appendNode($node); | 33 $this->Current()->appendNode($node); |
32 $this->Current($node); | 34 $this->Current($node); |
33 | 35 |
34 } else { | 36 } else { |
35 die new IMPL::InvalidOperationException("Requested elemnt not found in the schema"); | 37 die new IMPL::InvalidOperationException("Requested elemnt not found in the schema"); |
36 } | 38 } |
37 } | 39 } |
38 | 40 |
41 sub Back { | |
42 my ($this) = @_; | |
43 | |
44 $this->{$_navigatorSchema}->Back; | |
45 return $this->SUPER::Back(); | |
46 } | |
47 | |
39 1; | 48 1; |
49 | |
50 __END__ | |
51 =pod | |
52 | |
53 =head1 SYNOPSIS | |
54 | |
55 my $builder = new IMPL::DOM::Navigator::Builder(new MyApp::Document,$schema); | |
56 my $reader = new IMPL::DOM::XMLReader(Navigator => $builder); | |
57 | |
58 $reader->ParseFile("document.xml"); | |
59 | |
60 my @errors = $schema->Validate($builder->Document); | |
61 | |
62 =head1 DESCRIPTION | |
63 | |
64 Построитель DOM документов по указанной схеме. Обычно используется в связке | |
65 с объектами для чтения такими как C<IMPL::DOM::XMLReader>. | |
66 | |
67 =head1 METHODS | |
68 | |
69 =over | |
70 | |
71 =item C<CTOR($domDocument,$schema)> | |
72 | |
73 Создает новый объект, принимает на вход пустой (но не обязательно) документ и | |
74 схему. | |
75 | |
76 =item C<< $obj->NavigateCreate($nodeName) >> | |
77 | |
78 Создает новый узел с указанным именем и переходит в него. В случае если в схеме | |
79 подходящий узел не найден, то вызывается исключение. | |
80 | |
81 При этом схема узла производится по имени, после чего определяется класс для | |
82 создания узла, по алгоритму | |
83 | |
84 =over | |
85 | |
86 =item Проверяется свойство C<type> и если оно есть, то используется оно | |
87 | |
88 =item Проверяется свойство C<type> самого элемента схемы, если оно есть, то | |
89 используется оно. | |
90 | |
91 =item В качестве класса берется имя узла | |
92 | |
93 =back | |
94 | |
95 Также имя создаваемго узла может быть переопределено свойством C<nodeName>. | |
96 | |
97 Т.о. узел вида C<< <ComplexNode nodeName="Box" type="Container"> >> приведет | |
98 к созданию C<< Container->new(nodeName => 'Box') >>. | |
99 | |
100 =back | |
101 | |
102 =cut |