Como faço para sincronizar 2 arquivos xml?

1

Eu tenho dois arquivos xml chamados 1k.xml e 1n.xml .

O arquivo 1k.xml contém alguns elementos e dados adicionais que não estão lá em 1n.xml . Eu quero copiar o que está ausente em 1n.xml para ele, para que ambos os arquivos sejam idênticos, exceto pelo texto em um elemento.

1k.xml
<verse>
<verse-no>1</verse-no>
<section>Creation</section>
<verse-content>In the beginning God created the heaven and the earth.</verse-content>   
</verse>
...
<verse>
<verse-number>quote</verse-number>
<verse-quote>1:26, 27</verse-quote>
<quote>When Adam came from the Creator’s hand, he bore, in his physical, mental, and spiritual nature, a likeness to his Maker. “God created man in His own image” (Genesis 1:27), and it was His purpose that the longer man lived the more fully he should reveal this image—the more fully reflect the glory of the Creator. All his faculties were capable of development; their capacity and vigor were continually to increase. {Ed 15}</quote>
</verse> 

Diferenças entre 1k.xml e 1n.xml :

  1. sections estão ausentes em 1n.xml
  2. verse-content é diferente em 1n.xml - Esse é um elemento que quero manter como tal
  3. A coisa inteira de quote está ausente - de <verse> a </verse> em 1n.xml

Peculiaridades:

  1. Todos os versos não têm section . O section deve ser inserido no local correto - logo acima do verse-content do verse-number correto.
  2. O elemento quote também é aleatório - não há uma ordem na qual seja exibido.

Resumindo:

  1. Existe um software que pode sincronizar dois arquivos com opções para ignorar alguns aspectos?

  2. Posso fazer isso manualmente usando perl ou java (como tenho experimentado apenas nesses dois)?

  3. Por favor, aponte-me para algum tutorial ou caminho através do qual eu posso sincronizar esses dois arquivos em todos os aspectos, exceto para o verse-content dados.

Editar:

Basicamente, os arquivos são duas versões diferentes da Bíblia. Os arquivos *k.xml são da King James Version e *n.xml são da New King James Version.

Como você sabe, os números dos versos e os nomes dos arquivos seriam idênticos. A única diferença seria o texto do verso. A nova versão do Rei Jaime é uma tradução diferente da Bíblia.

O arquivo KJV foi modificado por mim. Eu adicionei manualmente as seções e aspas. Os arquivos NKJV não os possuem. Eles são crus. Eu quero transferir todas as seções e citações para os arquivos NKJV sem ter que refazê-lo manualmente.

Então, atualmente, a NKJV se parece com:

1n.xml
<verse>
<verse-no>1</verse-no>
<verse-content>In the beginning God created heavens and the earth.</verse-content>
</verse>

Não há citações nem seções também. O resultado final deve ser como:

End result 1n.xml:
<verse>
<verse-no>1</verse-no>
<section>Creation</section>
<verse-content>In the beginning God created heavens and the earth.</verse-content>   
</verse>
...
<verse>
<verse-number>quote</verse-number>
<verse-quote>1:26, 27</verse-quote>
<quote>When Adam came from the Creator’s hand, he bore, in his physical, mental, and spiritual nature, a likeness to his Maker. “God created man in His own image” (Genesis 1:27), and it was His purpose that the longer man lived the more fully he should reveal this image—the more fully reflect the glory of the Creator. All his faculties were capable of development; their capacity and vigor were continually to increase. {Ed 15}</quote>
</verse> 
    
por One Face 08.03.2015 / 07:23

1 resposta

2

Você pode fazer isso com o perl, usando o excelente módulo XML::Twig . Assumindo que eu entendi corretamente, a tarefa básica é copiar o elemento 'verso content' de um arquivo e 'todo o resto' de outro arquivo e criar um novo arquivo.

Então:

#!/usr/bin/perl
use strict;
use warnings;

use XML::Twig;

my %nkjv_content;

sub extract_content {
    my ( $twig, $verse )  = @_;
    my $verse_number      = $verse->first_child_text('verse-no');
    my $content           = $verse->first_child_text('verse-content');
    $nkjv_content{$verse} = $content;
}

my $nkjv = XML::Twig->new( twig_handlers => { 'verse' => \&extract_content } );
$nkjv ->parsefile('1n.xml');

my $merged_version = XML::Twig->new('pretty_print' => 'indented')->parsefile('1k.xml');

foreach my $verse ($merged_version) {
    my $verse_number = $verse->first_child_text('verse-no');
    print $verse_number, ":", $verse->first_child_text('verse-content'), "\n";

    #replace the content with the one from the nkjv source file. 
    $verse->first_child('verse_content')->set_content( $nkjv_content{$verse_number} );
}

$merged_version -> print();

Qual será:

  • analisa o arquivo nkjv e extrai os elementos verse-content em um hash.
  • carregue o 'n.xml' que contém mais das informações que você deseja manter.
  • percorra cada 'verso' e substitua o elemento verse-content pela versão nkjv.
  • imprima a saída (formatada / recuada)
por 16.03.2015 / 12:47