use strict;
use warnings;
my $xml;
sub xml_dataset_handler {
unless($xml) {
$xml = Simple::SAX::Serializer->new;
$xml->handler('dataset', sub {
my ($self, $element, $parent) = @_;
$element->validate_attributes([],
{load_strategy => "INSERT_LOAD_STRATEGY", reset_sequences => undef}
);
my $attributes = $element->attributes;
my $children_result = $element->children_result;
{properties => $attributes, dataset => $children_result}
}
);
$xml->handler('*', sub {
my ($self, $element, $parent) = @_;
my $parent_name = $parent->name;
my $attributes = $element->attributes;
if($parent_name eq 'dataset') {
my $children_result = $element->children_result || {};
my $parent_result = $parent->children_array_result;
my $result = $parent->children_result;
push @$parent_result, $element->name => [%$children_result, map { $_ => $attributes->{$_}} sort keys %$attributes];
} else {
$element->validate_attributes([], {size_column => undef, file => undef});
my $children_result = $parent->children_hash_result;
$children_result->{$element->name} = {%$attributes};
my $value = $element->value(1);
$children_result->{content} = $value if $value;
}
});
}
$xml;
}