#! 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