Divide o arquivo XML em vários arquivos

2

Eu tenho um arquivo xml que tem nós diferentes, eu quero dividir arquivos como este:

<unix>
 <mm>
</unix>
<osx>
 <nn>
</osx>

Quando eu executo o script, eu quero fazer um arquivo xml chamado unix.xml , que contém isso

<unix
 <mm>
</unix>

E, em seguida, outro arquivo xml chamado osx.xml , que contém isso

<osx>
 <nn>
</osx>
    
por DisplayName 25.10.2014 / 16:35

3 respostas

2

Primeiro, eu diria que é uma má idéia fazer uma análise XML com algo diferente de um analisador XML. Expressões regulares podem parecer como se estivessem indo para o trabalho, mas essa é uma maneira realmente boa de fazer algum código frágil - XML que semanticamente equivalente pode parecer diferente para diferentes REs (como recuos / linefeeds e unários Tag).

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

    
por 28.04.2015 / 13:55
0

Acho que o acompanhamento deve ajudar. Esta é uma tarefa comum que deve ser feita entre dois limites.

unset f t
while read l
do
  t=${t:+$t\n}$l
  l=${l//[<>]/}
  : ${f:="$l"}
  if [ "$l" = "/$f" ]
  then
    echo -e "$t" > "$f".xml 
    unset f t
  fi
done < <(cat your_xml_file)
    
por 25.10.2014 / 19:04
0

xml-cut de xml-coreutils pode realizar suas necessidades

    
por 25.10.2014 / 22:41