$VERSION
= 0.03;
sub
start_document {
my
(
$self
) =
@_
;
$self
->{args} = [];
$self
->{elements} = [];
}
sub
start_element {
my
(
$self
,
$element
) =
@_
;
my
$elements
=
$self
->{elements};
push
@{
$elements
}, [
$element
->{LocalName} => attributes(
$element
),
undef
,
''
];
$self
->{elements};
}
sub
attributes {
my
(
$element
) =
@_
;
my
%result
;
foreach
my
$k
(
keys
%{
$element
->{Attributes}}) {
my
$attr
=
$element
->{Attributes}->{
$k
};
my
$prefix
=
$attr
->{Prefix};
if
(
$prefix
) {
$result
{
"_${prefix}"
}{
$attr
->{LocalName}} ||= {};
$result
{
"_${prefix}"
}{
$attr
->{LocalName}} =
$attr
->{Value};
}
else
{
$result
{
$attr
->{LocalName}} =
$attr
->{Value};
}
}
\
%result
;
}
sub
characters {
my
(
$self
,
$data
) =
@_
;
my
$current_element
=
$self
->{elements}->[-1];
$current_element
->[-1] .=
$data
->{Data};
}
my
$element
= Simple::SAX::Serializer::Element->new;
my
$parent
= Simple::SAX::Serializer::Element->new;
sub
end_element {
my
(
$self
,
$sax_element
) =
@_
;
my
$elements
=
$self
->{elements};
my
$args
=
$self
->{args};
if
(
my
$callback
=
$self
->{parser}->find_handlder(
$elements
)) {
$element
->set_node(
$elements
->[-1]);
$parent
->set_node(
$elements
->[-2])
if
(
@$elements
> 1);
my
$result
=
$callback
->(
$self
,
$element
,
(
@$elements
> 1 ?
$parent
: ())
);
$self
->{result} =
$result
if
@$elements
== 1;
}
pop
@$args
;
pop
@$elements
;
}
sub
root_args {
my
(
$self
) =
@_
;
$self
->{root_args} ||= {};
}
1;