in reply to Merging two XML files (with conflicts)
I hate XML, but I like Simple :)
#! 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__ <NODEA> <NODEB UID="111" > <NODEC name="1" > <NODED> text1 </NODED> <NODED> text2 </NODED> </NODEC> </NODEB> <NODEB UID="222" > <NODEC name="2" > <NODED> text1 </NODED> <NODED> text2 </NODED> </NODEC> </NODEB> </NODEA> __PATCH__ <NODEA> <NODEB UID="111" > <NODEC name="1" > <NODED> patched text 1 </NODED> <NODED> patched text 2 </NODED> </NODEC> </NODEB> <NODEB UID="333" > <NODEC name="3" > <NODED> text1 </NODED> <NODED> text2 </NODED> </NODEC> </NODEB> </NODEA>
Outputs:
c:\test>952158 <NODEA> <NODEB UID="111"> <NODEC name="1"> <NODED> patched text 1 </NODED> <NODED> patched text 2 </NODED> </NODEC> </NODEB> <NODEB UID="222"> <NODEC name="2"> <NODED> text1 </NODED> <NODED> text2 </NODED> </NODEC> </NODEB> <NODEB UID="333"> <NODEC name="3"> <NODED> text1 </NODED> <NODED> text2 </NODED> </NODEC> </NODEB> </NODEA>
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Merging two XML files (with conflicts)
by pwnguin (Initiate) on Feb 06, 2012 at 22:57 UTC |