Então, com isso em mente - eu usaria o Perl e a biblioteca XML::Twig
. Esta é uma coisa bastante normal - existem pacotes pré-construídos onipresentes.
No entanto, talvez o mais importante de tudo - o XML que você publicou NÃO é válido. Eu vou assumir que é porque é uma amostra, e não o XML real, e então você perdeu um pouco. Estou usando como minha amostra:
<root>
<unix>
<mm />
</unix>
<osx>
<nn />
</osx>
</root>
E o uso desse código faz o que você pede:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new( 'pretty_print' => 'indented' );
$twig->parsefile("your_xml.xml");
foreach my $element ( $twig->root->children ) {
my $tag = $element->tag;
print "Processing $tag\n";
#print to STDOUT for debugging
print $element ->sprint;
#print to output file
open( my $output, ">", "$tag.xml" ) or warn $!;
print {$output} $element->sprint;
close($output);
}
Se é claro, sua postagem de XML é literalmente o que você tem, então está quebrado XML e você deve idealmente ir e acertar quem lhe deu um com uma cópia enrolada do documento de especificação . Se isso for impraticável por ser uma vida real, então eu lhe daria essa resposta no Stack Overflow: link