XML-Handler-ExtOn
view release on metacpan or search on metacpan
- add_namespace to ExtOn
- add delete alias
0.04
- add SAX1 to ExtOn converter
0.03
- add tests
- documenting
- get attrs by name ( by_name )
0.02
- add mk_characters and mk_cdata
- add on_cdata
lib/XML/Handler/ExtOn/TieAttrsName.pm
Makefile.PL
MANIFEST
README
t/008_PSAX::TieAttrs.t
t/009_ExtOn::Attributes.t
t/009_ExtOn::Context.t
t/010_Element.t
t/050.t
t/060_ExtOn_skip_root.t
t/070_characters_cdata.t
t/080_create_pipe.t
META.yml
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
=item * on_start_document
=item * on_start_prefix_mapping
=item * on_start_element
=item * on_end_element
=item * on_characters
=item * on_cdata
=back
XML::Handler::ExtOn put all B<cdata> characters into a single event C<on_cdata>.
It compliant XML namespaces (http://www.w3.org/TR/REC-xml-names/), by support
I<default namespace> and I<namespace scoping>.
XML::Handler::ExtOn provide methods for create XML, such as C<mk_element>, C<mk_cdata> ...
=head1 FUNCTIONS
=cut
use strict;
use warnings;
use Carp;
use Data::Dumper;
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
}
}
return $out_handler;
}
use base 'XML::SAX::Base';
use vars qw( $AUTOLOAD);
$XML::Handler::ExtOn::VERSION = '0.06';
### install get/set accessors for this object.
for my $key (qw/ context _objects_stack _cdata_mode _cdata_characters/) {
no strict 'refs';
*{ __PACKAGE__ . "::$key" } = sub {
my $self = shift;
$self->{___EXT_on_attrs}->{$key} = $_[0] if @_;
return $self->{___EXT_on_attrs}->{$key};
}
}
=head1 METHODS
=cut
sub new {
my $class = shift;
my $self = &XML::SAX::Base::new( $class, @_, );
$self->_objects_stack( [] );
$self->_cdata_mode(0);
my $buf;
$self->_cdata_characters( \$buf ); #setup cdata buffer
my $doc_context = new XML::Handler::ExtOn::Context::;
$self->context($doc_context);
return $self;
}
=head2 on_start_document $document
Method handle C<start_document> event. Usually override for initialaize default
variables.
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
Method handle C<on_start_element> event whith XML::Handler::ExtOn::Element object.
Method must return C<$elem> or ref to array of objects.
For example:
sub on_start_element {
my $self = shift;
my $elem = shift;
$elem->add_content( $self->mk_cdata("test"));
return $elem
}
...
return [ $elem, ,$self->mk_element("after_start_elem") ]
return [ $self->mk_element("before_start_elem"), $elem ]
...
=cut
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
}
=cut
sub on_characters {
my ( $self, $elem, $str ) = @_;
return $str;
}
=head2 on_cdata ( $current_element, $data )
Must return string for write to stream
sub on_cdata {
my ( $self, $elem, $str ) = @_;
return lc $str;
}
=cut
sub on_cdata {
my ( $self, $elem, $str ) = @_;
return $str;
}
#set flag for cdata content
sub start_cdata {
my $self = shift;
$self->_cdata_mode(1);
return;
}
#set flag to end cdata
sub end_cdata {
my $self = shift;
if ( my $elem = $self->current_element
and defined( my $cdata_buf = ${ $self->_cdata_characters } ) )
{
if ( defined( my $data = $self->on_cdata( $elem, $cdata_buf ) ) ) {
$self->SUPER::start_cdata;
$self->SUPER::characters( { Data => $data } );
$self->SUPER::end_cdata;
}
}
#after all clear cd_data_buffer and reset cd_data mode flag
my $new_buf;
$self->_cdata_characters( \$new_buf );
$self->_cdata_mode(0);
return;
}
sub characters {
my $self = shift;
my ($data) = @_;
#skip childs elements characters ( > 1 ) and self text ( > 0)
# warn $self.Dumper([ map {[caller($_)]} (1..10)]) unless $self->current_element;
if ( $self->current_element ) {
return if $self->current_element->is_skip_content;
}
else {
#skip characters without element
return
# #warn "characters without element"
}
#for cdata section collect characters in buffer
if ( $self->_cdata_mode ) {
${ $self->_cdata_characters } .= $data->{Data};
return;
}
#collect chars fo current element
if (
defined(
my $str =
$self->on_characters( $self->current_element, $data->{Data} )
)
)
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
my $sax2_filter = XML::Filter::SAX1toSAX2->new( Handler => $skip_tmp_root );
my $parser = XML::Parser::PerlSAX->new(
{
Handler => $sax2_filter,
Source => { String => "<tmp>$string</tmp>" }
}
);
return $parser;
}
=head2 mk_cdata $string | \$string
return command for insert cdata to stream
=cut
sub mk_cdata {
my $self = shift;
my $string = shift;
return { type => 'CDATA', data => ref($string) ? $string : \$string };
}
=head2 mk_characters $string | \$string
return command for insert characters to stream
=cut
lib/XML/Handler/ExtOn.pm view on Meta::CPAN
elsif ( UNIVERSAL::isa( $comm, 'XML::Handler::ExtOn::Element' ) ) {
$self->start_element($comm);
while ( my $obj = shift @{ $comm->_stack } ) {
$self->_process_comm($obj);
}
$self->end_element($comm);
}
elsif ( ref($comm) eq 'HASH' and exists $comm->{type} ) {
if ( $comm->{type} eq 'CDATA' ) {
$self->start_cdata;
$self->characters( { Data => ${ $comm->{data} } } );
$self->end_cdata;
}
elsif ( $comm->{type} eq 'CHARACTERS' ) {
$self->characters( { Data => ${ $comm->{data} } } );
}
}
else {
warn " Unknown DATA $comm";
}
}
lib/XML/Handler/ExtOn/Element.pm view on Meta::CPAN
my $self = shift;
$self->{__name} = shift || return $self->{__name};
}
=head2 add_content <element object1>[, <element object2> ...]
Add commands to contents stack.Return C<$self>
$elem->add_content(
$self->mk_from_xml("<p/>"),
$self->mk_cdata("TEST CDATA"),
)
=cut
sub add_content {
my $self = shift;
push @{$self->_stack()}, @_;
return $self
}
t/070_characters_cdata.t view on Meta::CPAN
my $psax_filter = $name->new( Handler => $w1 );
return $psax_filter, \$str1;
}
my $str;
my ( $filter, $res ) = create_parser_no_parse('MyHandler1');
$filter->start_document;
my $s_elem =
$filter->mk_element("a")
->add_content( $filter->mk_from_xml("<p/>"),
$filter->mk_cdata(\"00000"), $filter->mk_characters("**"));
$filter->start_element($s_elem);
$filter->start_cdata( );
$filter->characters( { Data => "asdasdad" } );
$filter->end_cdata();
$filter->end_element();
$filter->end_document;
is ( '00000asdasdad', $filter->{CDTAAAA}, 'test cd_data');
is ( '**', $filter->{CHARS}, 'test characters');
#diag $$res;
#diag $filter->{CDTAAAA};
exit;
package MyHandler1;
use base 'XML::Handler::ExtOn';
use strict;
use warnings;
sub on_start_element {
my ( $self, $elem ) = @_;
return $elem;
}
sub on_cdata {
my $self = shift;
my $elem = shift;
my $string = shift;
$self->{CDTAAAA} .= $string;
return $string
}
sub on_characters {
my $self = shift;
my $elem = shift;
my $string = shift;
( run in 0.890 second using v1.01-cache-2.11-cpan-454fe037f31 )