NAME
XML::Handler::ExtOn - The handler for expansion of Perl SAX by objects.
SYNOPSYS
use
XML::Handler::ExtOn;
For write XML:
use
XML::Handler::ExtOn;
my
$buf
;
my
$wrt
= XML::SAX::Writer->new(
Output
=> \
$buf
);
my
$ex_parser
= new XML::Handler::ExtOn::
Handler
=>
$wrt
;
$ex_parser
->start_document;
my
$root
=
$ex_parser
->mk_element(
"Root"
);
$root
->add_namespace(
);
$ex_parser
->start_element(
$root
);
my
$el
=
$root
->mk_element(
'vars'
);
%{
$el
->attrs_by_prefix(
"myns"
) } = (
v1
=> 1,
v2
=> 3 );
%{
$el
->attrs_by_prefix(
"myns_test"
) } =
(
var1
=>
"test ns"
,
var2
=>
"2333"
);
$root
->add_content(
$el
);
$ex_parser
->end_element;
$ex_parser
->end_document;
$buf
;
Result:
<?xml version=
"1.0"
?>
<Root xmlns:myns=
"http://example.com/myns"
<vars myns_test:var2=
"2333"
myns_test:var1=
"test ns"
myns:v1=
"1"
myns:v2=
"3"
/>
</Root>
For handle events
Begin method for handle SAX event start_element:
sub
on_start_element {
my
(
$self
,
$elem
) =
@_
;
...
Check localname for element and add tag image
:
if
(
$elem
->local_name eq
'gallery'
) {
$elem
->add_content(
$self
->mk_element(
'image'
)->add_content(
$self
->mk_characters(
"Image number: $_"
)
)
)
for
1..2 ;
}
XML Before:
<?xml version=
"1.0"
?>
<Document>
<gallery/>
</Document>
After:
<?xml version=
"1.0"
?>
<Document>
<gallery>
<image>Image number: 1</image>
<image>Image number: 2</image>
</gallery>
</Document>
Register namespace and set variables
#set attributes for name space
my
$demo_attrs
=
$elem
->attrs_by_prefix(
'demons'
);
%{
$demo_attrs
} = (
variable1
=>1,
'variable2'
=>2);
#set attributes for namespace URI
%{
$ns2_attrs
} = (
var
=>
'ns1'
,
'raw'
=>2);
Result:
xmlns:ns2=
"http://example.org/ns2"
demons:variable2=
"2"
ns2:var=
"ns1"
demons:variable1=
"1"
ns2:raw=
"2"
/>
Delete content of element
if
(
$elem
->local_name eq
'demo_delete'
) {
$elem
->skip_content
}
XML before:
<?xml version=
"1.0"
?>
<Document>
<demo_delete>
<p>text</p>
</demo_delete>
</Document>
After:
<?xml version=
"1.0"
?>
<Document>
<demo_delete/>
</Document>
Add XML:
$elem
->add_content (
$self
->mk_from_xml(
'<custom><p>text</p></custom>'
)
)
Can add element
after
current
...
return
[
$elem
,
$self
->mk_element(
"after"
) ];
}
DESCRIPTION
XML::Handler::ExtOn - SAX Handler designed for funny work with XML. It provides an easy-to-use interface for XML applications by adding objects.
XML::Handler::ExtOn override some SAX events. Each time an SAX event starts, a method by that name prefixed with `on_' is called with the "blessed" Element object to be processed.
XML::Handler::ExtOn implement the following methods:
on_start_document
on_start_prefix_mapping
on_start_element
on_end_element
on_characters
on_cdata
XML::Handler::ExtOn put all cdata characters into a single event on_cdata
.
It compliant XML namespaces (http://www.w3.org/TR/REC-xml-names/), by support default namespace and namespace scoping.
XML::Handler::ExtOn provide methods for create XML, such as mk_element
, mk_cdata
...
FUNCTIONS
create_pipe "flt_n1",$some_handler, $out_handler
use last arg as handler for out.
return parser ref.
my
$h1
= new MyHandler1::;
my
$filter
= create_pipe(
'MyHandler1'
,
$h1
);
$filter
->parse(
'<root><p>TEST</p></root>'
);
METHODS
on_start_document $document
Method handle start_document
event. Usually override for initialaize default variables.
sub
on_start_document {
my
$self
=
shift
;
$self
->{_LINKS_ARRAY} = [];
$self
->SUPER::on_start_document(
@_
);
}
on_start_prefix_mapping prefix1=>ns_uri1[, prefix2=>ns_uri2]
Called on start_prefix_mapping
event.
sub
on_start_prefix_mapping {
my
$self
=
shift
;
my
%map
=
@_
;
$self
->SUPER::start_prefix_mapping(
@_
)
}
on_start_element $elem
Method handle on_start_element
event whith XML::Handler::ExtOn::Element object.
Method must return $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
]
...
on_end_element $elem
Method handle on_end_element
event whith XML::Handler::ExtOn::Element object. It call before end if element.
Method must return $elem
or ref to array of objects.
For example:
sub
on_end_element {
my
$self
=
shift
;
my
$elem
=
shift
;
if
(
$elem
->is_delete_element ) {
warn
$elem
->local_name .
" deleted"
;
return
[
$elem
,
$self
->mk_element(
"after_deleted_elem"
) ]
};
return
$elem
}
...
return
[
$elem
, ,
$self
->mk_element(
"after_close_tag_of_elem"
) ]
return
[
$self
->mk_element(
"before_close_tag_of_elem"
),
$elem
]
...
on_characters( $self->current_element, $data->{Data} )
Must return string for write to stream.
sub
on_characters {
my
(
$self
,
$elem
,
$str
) =
@_
;
#lowercase all characters
return
lc
$str
;
}
on_cdata ( $current_element, $data )
Must return string for write to stream
sub
on_cdata {
my
(
$self
,
$elem
,
$str
) =
@_
;
return
lc
$str
;
}
mk_element <tag name>
Return object of element item for include to stream.
mk_from_xml <xml string>
Return command for include to stream.
mk_cdata $string | \$string
return command for insert cdata to stream
mk_characters $string | \$string
return command for insert characters to stream
current_element
Return link to current processing element.
add_namespace <Prefix> => <Namespace_URI>, [ <Prefix1> => <Namespace_URI1>, ... ]
Add Namespace mapping. return $self
If Prefix
eq '', this namespace will then apply to all elements that have no prefix.
$elem
->add_namespace(
);
SEE ALSO
XML::Handler::ExtOn::Element, XML::SAX::Base
AUTHOR
Zahatski Aliaksandr, <zag@cpan.org>
COPYRIGHT AND LICENSE
Copyright (C) 2007-2008 by Zahatski Aliaksandr
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.