File Coverage

blib/lib/XML/Filter/DOMFilter/LibXML.pm
Criterion Covered Total %
statement 6 8 75.0
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 9 11 81.8


line stmt bran cond sub pod time code
1             package XML::Filter::DOMFilter::LibXML;
2              
3 1     1   2353525 use 5.006;
  1         3  
4 1     1   5 use strict;
  1         2  
  1         46  
5             our $VERSION = '0.04';
6              
7 1     1   1469 use XML::LibXML::SAX::Builder;
  0            
  0            
8             use XML::LibXML::SAX::Parser;
9             use base qw(XML::LibXML::SAX::Builder);
10              
11             sub _match {
12             my ($self,$ctxt) = @_;
13             my $p = $self->{Process};
14             if ($self->{XPathContext}) {
15             $self->{XPathContext}->setContextNode($ctxt);
16             $ctxt=$self->{XPathContext};
17             }
18             return unless ref($p);
19             for (my $i=0; $i<$#$p; $i+=2) {
20             if ($ctxt->find($p->[$i])) {
21             $self->{Matched}=$p->[$i+1];
22             return 1;
23             }
24             }
25             }
26              
27             sub start_document {
28             my $self = shift;
29             $self->SUPER::start_document(@_);
30             $self->{Handler}->start_document(@_) if defined($self->{Handler});
31             }
32              
33             sub xml_decl {
34             my $self = shift;
35             $self->SUPER::xml_decl(@_);
36             $self->{Handler}->xml_decl(@_) if defined($self->{Handler});
37             }
38              
39             sub end_document {
40             my $self = shift;
41             $self->SUPER::end_document(@_);
42             $self->{Handler}->end_document(@_) if defined($self->{Handler});
43             }
44              
45             sub start_prefix_mapping {
46             my $self = shift;
47             $self->SUPER::start_prefix_mapping(@_);
48             $self->{Handler}->start_prefix_mapping(@_) unless (!defined($self->{Handler}) ||
49             $self->{FULL_TREE});
50             }
51              
52             sub end_prefix_mapping {
53             my $self = shift;
54             $self->SUPER::end_prefix_mapping(@_);
55             $self->{Handler}->end_prefix_mapping(@_) unless (!defined($self->{Handler}) ||
56             $self->{FULL_TREE});
57             }
58              
59             sub start_dtd {
60             my $self = shift;
61             # $self->SUPER::start_dtd(@_); # not implemented by Builder
62             $self->{Handler}->start_dtd(@_) if defined($self->{Handler});
63             }
64              
65             sub end_dtd {
66             my $self = shift;
67             # $self->SUPER::end_dtd(@_); # not implemented by Builder
68             $self->{Handler}->end_dtd(@_) if defined($self->{Handler});
69             }
70              
71             sub start_cdata {
72             my $self = shift;
73             $self->SUPER::start_cdata(@_);
74             $self->{Handler}->start_cdata(@_) unless (!defined($self->{Handler}) ||
75             $self->{FULL_TREE});
76             }
77              
78             sub end_cdata {
79             my $self = shift;
80             $self->SUPER::end_cdata(@_);
81             $self->{Handler}->end_cdata(@_) unless (!defined($self->{Handler}) ||
82             $self->{FULL_TREE});
83             }
84              
85              
86             sub start_entity {
87             my $self = shift;
88             $self->SUPER::start_entity(@_);
89             $self->{Handler}->start_entity(@_) unless (!defined($self->{Handler}) ||
90             $self->{FULL_TREE});
91             }
92              
93             sub end_entity {
94             my $self = shift;
95             $self->SUPER::end_entity(@_);
96             $self->{Handler}->end_entity(@_) unless (!defined($self->{Handler}) ||
97             $self->{FULL_TREE});
98             }
99              
100              
101             sub start_element {
102             my ($self, $el) = @_;
103             my $parent = $self->{Parent};
104              
105             # if ($self->{FULL_TREE}==0 and defined($parent)) {
106             # foreach ($parent->childNodes()) {
107             # $_->unbindNode();
108             # }
109             # }
110             $self->SUPER::start_element($el);
111             if ($self->{FULL_TREE}) {
112             $self->{FULL_TREE}++;
113             } else {
114             if (defined($self->{DOM}) and
115             $self->_match($parent || $self->{DOM})) {
116             $self->{FULL_TREE}=1;
117             } else {
118             $self->{Handler}->start_element($el) if defined($self->{Handler});
119             }
120             }
121             }
122              
123             sub end_element {
124             my $self = shift;
125             my $node=$self->{Parent};
126             my $parent=$node->parentNode || $self->{DOM};
127             $self->SUPER::end_element(@_);
128             if ($self->{FULL_TREE} == 1) {
129             if ($self->{Matched}) {
130             # pass the result to Handler as SAX events
131             if (ref($self->{Matched}) eq 'ARRAY') {
132             # with parameters
133             &{$self->{Matched}[0]}($node,@{$self->{Matched}}[1..$#{$self->{Matched}}]);
134             } else {
135             # simple callback
136             &{$self->{Matched}}($node);
137             }
138             if ($self->{Handler}) {
139             my $process=XML::LibXML::SAX::Parser->new(Handler => $self->{Handler});
140             foreach my $n ($parent->childNodes) {
141             $process->process_node($n);
142             $n->unbindNode();
143             }
144             } else {
145             $parent->removeChildNodes;
146             }
147             }
148             }
149             if ($self->{FULL_TREE}) {
150             $self->{FULL_TREE}--;
151             } else {
152             $self->{Handler}->end_element(@_) if defined($self->{Handler});
153             }
154             }
155              
156             sub characters {
157             my $self = shift;
158             if ($self->{FULL_TREE}) {
159             $self->SUPER::characters(@_);
160             } else {
161             $self->{Handler}->characters(@_) if defined($self->{Handler});
162             }
163             }
164              
165             sub comment {
166             my $self = shift;
167             if ($self->{FULL_TREE}) {
168             $self->SUPER::comment(@_);
169             } else {
170             $self->{Handler}->comment(@_) if defined($self->{Handler});
171             }
172             }
173              
174             sub processing_instruction {
175             my $self = shift;
176             if ($self->{FULL_TREE}) {
177             $self->SUPER::processing_instruction(@_);
178             } else {
179             $self->{Handler}->processing_instruction(@_) if defined($self->{Handler});
180             }
181             }
182              
183             1;
184             __END__