package MyXMLSimple;
use base 'XML::Simple';
sub sorted_keys { my ( $self, $name, $hashref ) = @_; return sort { main::element_order($a) <=> main::element_order($b) } keys(%{$hashref}); };
... SNIP ...
return $parser->XMLout($xml,
KeyAttr => [],
RootName => 'Zymonic',
NoEscape => 1,
SuppressEmpty => 1
);
####
sub add_nodes_hash
{
#first time $xml will be the file, after that it will be the hash or array ref
# $is_child is a flag to see if it wants to be added as like a root node, or part of a nest
my $xml = shift;
my $parent_element = shift;
foreach my $node (sort {element_order($a) <=> element_order($b)} keys %{$xml})
{
#next if ($node =~/\//);
if (ref($xml->{$node}) eq 'HASH')
{
my $element = $dom->createElement( $node );
$parent_element->insertAfter($element,undef);
add_nodes_hash($xml->{$node},$element);
}
if (ref( $xml->{$node} ) eq 'ARRAY')
{
foreach my $array_element (@{$xml->{$node}})
{
if (ref($array_element) eq 'HASH')
{
my $element = $dom->createElement( $node );
my @attributes = $element->attributes();
$parent_element->insertAfter($element,undef);
add_nodes_hash($array_element,$element);
}
elsif (!ref( $xml->{$node} ) && ($xml->{$node}))
{
my $element = $dom->createElement( $node );
$element->appendText($xml->{$node});
$parent_element->insertAfter($element,undef);
}
}
}
elsif (!ref( $xml->{$node} ) && ($xml->{$node}))
{
my $element = $dom->createElement( $node );
$element->appendText($xml->{$node});
$parent_element->insertAfter($element,undef);
}
}
return $dom;
}
sub libxml_output {
my $xml = shift;
#create the dom object
$dom = XML::LibXML::Document->new();
my $root = $dom->createElement('Zymonic');
$dom->setDocumentElement($root);
add_nodes_hash($xml, $root);
return $dom->toString(1);
}
####
====================TIMINGS=======================
LibXML time for 100 rep(s): 5409.750 ms
XML Simple time for 100 rep(s): 3699.437 ms