Mesclar apenas novas entradas de um arquivo xml para outro

2

Eu tenho 2 arquivos xml. O segundo arquivo tem algumas novas entradas, incluindo as mesmas entradas do primeiro arquivo. Exemplos dos 2 arquivos são fornecidos abaixo.

Arquivo 1

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>

Arquivo 2

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.1.21</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

Após a mesclagem

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

Quando eu mesclar o segundo arquivo com o primeiro arquivo, a mesclagem deve ocorrer de forma que somente novas entradas no segundo arquivo sejam mescladas, ou seja, as entradas já existentes no primeiro arquivo devem permanecer como estão. Existe o comando sdiff para mesclar interativamente. Mas eu quero automatizar o processo de mesclagem. Como faço para mesclar esses arquivos?

    
por Mathew 15.03.2016 / 08:49

1 resposta

0

XMLs podem ser e geralmente são difíceis de serem manipulados com as boas e velhas ferramentas de shell; é preciso usar analisadores XML, procurando por nós. No entanto, se e somente se o formato de seus arquivos é realmente tão simples quanto escrito (quebras de linha estão sempre lá, as tags importantes não são aninhadas em outras tags e elas iniciam as linhas), então isso pode ser feito com start-tag-to Correspondência de padrões de tag de finalização.

 $ cat mergexml.awk

FILENAME!=fn { ++fcnt; fn = FILENAME }

fcnt == 1 {
   print
   str = $0
   if ( inside ) {
      if ( str ~ "^ *</ *" tag " *> *$") {
         inside = 0
      }
   } else {
      gsub( /^ *< *| *> *$/, "", str)
      if ( str ~ /^[[:alnum:]_]+$/) {
         tag = str
         f1tags[tag] = ""
         inside = 1
      }
   }
}

fcnt == 2 {
   str = $0
   if ( inside ) {
      print
      if ( str ~ "^ *</ *" tag " *> *$") {
         inside = 0
      }
   } else {
      gsub( /^ *< *| *> *$/, "", str)
      if ( str ~ /^[[:alnum:]_]+$/) {
         tag = str
         if ( ! (tag in f1tags)) {
            inside = 1
            print
         }
      }
   }
}

$ awk -f mergexml.awk file1 file2
<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

A ordem dos arquivos na linha de comando é importante .

    
por 15.03.2016 / 15:28