Pergunta

Eu fui incumbido de criar uma ferramenta que pode diff e mesclar os arquivos de configuração para o produto da minha empresa. As configurações são armazenadas como XML ou cordas URL-codificados. Eu estou procurando uma fonte de biblioteca, de preferência aberto com uma licença compatível com software comercial, que pode fazer estes diffs. Nosso aplicativo é escrito em C ++, para que as bibliotecas C ++ seria melhor, mas estou disposto a olhar para as bibliotecas que são C # espec�ico desde que eu posso escrever um wrapper que expõe a C ++ via COM. Três vias diffs seria o ideal, mas de duas vias é aceitável. Se ele tem uma compreensão de XML, que também seria um plus (desde nós XML podem ser reordenadas sem alterar o documento, etc). Todas as sugestões biblioteca? Devo ainda considere escrever minhas próprias ferramentas diff na esperança de dar-lhe conhecimento semântico dos nossos formatos?

Graças à esta pergunta semelhante , eu já descobri este google biblioteca, que parece realmente grande, mas eu ainda estou procurando para outras opções. Ele também parece ser capaz de produzir os diffs em formato HTML (usando as tags <ins> e <del> que eu não sabia que existiam antes que eu descobri-lo), o que poderia ser realmente útil, mas parece ser apenas um diff unificado. Eu vou precisar para exibir os resultados em um navegador web, e, provavelmente, tem que construir uma interface para fazer as fusões no navegador também. Não espero uma biblioteca para ser capaz de ajudar com estas tarefas, mas deve produzir uma saída em um formato que é passível de me construir esta em cima dela. Atualmente estou imaginando algo ao longo das linhas de TortoiseMerge (side-by-side diffs, não unificadas), exceto navegador baseado. Quaisquer dicas / truques / idéias de design sobre como apresentar isso seria apreciada também.

Foi útil?

Solução

Para diffing o XML eu proporia que você normalizar-lo primeiro: classificar todos os elementos em ordem alfabética, em seguida, gerar um fluxo de tokens / xml que representa o documento original, mas é independente da formatação original. Depois de executar o diff, analisar o resultado para obter uma árvore contendo o que foi adicionado / removido.

Outras dicas

Subversion vem com libsvn_diff e libsvn_delta licenciada sob Apache Software License.

Aqui é uma biblioteca C ++ que pode diff o que o autor chama de dados semi-estruturada. Ele lida bem com HTML e XML. Desde seus dados é XML não faria muito sentido usar isso em vez de diff texto simples. Este é especialmente o caso quando os arquivos são gerados máquina.

Atualmente, estou tentando usar esta biblioteca para construir uma ferramenta que diffs arquivos de projeto do Visual Studio. Estes são basicamente arquivos XML e usando uma ferramenta de comparação simples, como Winmerge é muito doloroso porque o Visual Studio praticamente mucks de todo o arquivo de reordenamento louco. A idéia é fazer algum tipo de diff estruturado para resolver o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top