XML-Hash-LX
view release on metacpan or search on metacpan
lib/XML/Hash/LX.pm view on Meta::CPAN
push @rv, map {
defined($_) ? do {
$H2X{trim} and s/(?:^\s+|\s+$)//sg;
$H2X{trim} && !length($_) ? () :
$cdata_or_text->new( $_ )
} : (),
} ref $data->{$_} ? @{ $data->{$_} } : $data->{$_};
}
elsif (defined $H2X{comm} and $_ eq $H2X{comm}) {
push @rv, map XML::LibXML::Comment->new(defined $_ ? $_ : ''), ref $data->{$_} ? @{ $data->{$_} } : $data->{$_};
}
elsif (substr($_,0,$AL) eq $H2X{attr} ) {
if ($parent) {
$parent->setAttribute( substr($_,1),defined $data->{$_} ? $data->{$_} : '' );
} else {
warn "attribute $_ without parent"
}
}
elsif ( !defined $data->{$_} or ( !ref $data->{$_} and !length $data->{$_} ) ) {
push @rv,XML::LibXML::Element->new($_);
}
else {
local $hd = $hd.'/'.$_;
my $node = XML::LibXML::Element->new($_);
#warn ("$hd << ".$_->nodeName),
$node->appendChild($_) for _h2x($data->{$_},$node);
push @rv,$node;
}
}
}
elsif (ref $data eq 'SCALAR') { # RAW
my $node = eval { XML::LibXML->new->parse_string($$data) } or _croak "Malformed raw data on $hd: $@";
return $node->documentElement;
}
elsif (ref $data eq 'REF') { # LibXML Node
if (ref $$data and eval{ $$data->isa('XML::LibXML::Node') }) {
return $$data->cloneNode(1);
}
elsif ( ref $$data and do { no strict 'refs'; exists ${ ref($$data).'::' }{'(""'} } ) {
return XML::LibXML::Text->new( "$$data" );
}
else {
_croak ("Bad reference ".ref( $$data ).": <$$data> on $hd");
}
}
elsif ( do { no strict 'refs'; exists ${ ref($data).'::' }{'(""'} } ) { # have string overload
return XML::LibXML::Text->new( "$data" );
}
elsif (ref $data and eval{ $data->isa('XML::LibXML::Node') }) {
return $data->cloneNode(1);
}
else {
_croak "Bad reference ".ref( $data ).": <$data> on $hd";
}
#warn "@rv";
return wantarray ? @rv : $rv[0];
}
sub hash2xml($;%) {
#warn "hash2xml(@_) from @{[ (caller)[1,2] ]}";
my $hash = shift;
my %opts = @_;
my $str = delete $opts{doc} ? 0 : 1;
my $encoding = delete $opts{encoding} || delete $opts{enc} || 'utf-8';
my $doc = XML::LibXML::Document->new('1.0', $encoding);
local @H2X{keys %opts} = values %opts if @_;
local $AL = length $H2X{attr};
#use Data::Dumper;
#warn Dumper \%H2X;
my $root = _h2x($hash);
$doc->setDocumentElement($root);
return $str ? $doc->toString : $doc;
}
=head1 BUGS
None known
=head1 SEE ALSO
=over 4
=item * L<XML::Parser::Style::EasyTree>
With default settings should produce the same output as this module. Settings are similar by effect
=back
=head1 AUTHOR
Mons Anderson, C<< <mons at cpan.org> >>
=head1 COPYRIGHT & LICENSE
Copyright 2009 Mons Anderson, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
1; # End of XML::Hash::LX
( run in 0.645 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )