#! perl -slw
use strict;
use Inline::Files;
use XML::Simple;
sub traverse ($$);
sub traverse ($$) {
my( $xml, $pat ) = @_;
if( ref $pat eq 'HASH' ) {
for my $key ( keys %$pat ) {
if( exists $xml->{ $key } and ref $pat->{ $key } ) {
traverse( $xml->{ $key }, $pat->{ $key } );
next;
}
$xml->{ $key } = $pat->{ $key };
}
}
elsif( ref $pat eq 'ARRAY' ) {
for my $idx ( 0 .. $#$pat ) {
if( ref $pat->[ $idx ] eq 'HASH' ) {
traverse( $xml->[ $idx ], $pat->[ $idx ] );
next;
}
$xml->[ $idx ] = $pat->[ $idx ];
}
}
}
my $xml = XMLin( \*XML1, KeyAttr => [ 'UID' ], KeepRoot => 1 );
my $pat = XMLin( \*PATCH, KeyAttr => [ 'UID' ], KeepRoot => 1 );
traverse( $xml, $pat );
print XMLout( $xml, KeyAttr => [ 'UID' ], KeepRoot => 1 );
__DATA__
__XML1__
text1
text2
text1
text2
__PATCH__
patched text 1
patched text 2
text1
text2
####
c:\test>952158
patched text 1
patched text 2
text1
text2
text1
text2