Inquiridor
Comparar arquivos XML

Pergunta
-
Estou com dois arquivos XML e quero comparar este dois e vê se tem alguma diferença entre ambos e mostrar uma mensagem para o usuário, dizendo quais campos estão "idênticos". Ex:
<catalogo>
<recurso>
<chave>wms_configuracao_recarga</chave>
<nome>WMS - Configuração de Recarga</nome>
<tabela>wms_configuracao_recarga</tabela>
<heranca>padrao_log</heranca>
<propriedade>
<chave>tipo</chave>
<nome>Tipo</nome>
<coluna>tipo</coluna>
<tipo>string</tipo>
<tamanho>15</tamanho>
<obrigatorio>sim</obrigatorio>
<dominio>
<item>
<chave>recarga_bateria</chave>
<nome>Recarga de Bateria</nome>
</item>
<item>
<chave>troca_bateria</chave>
<nome>Troca de Bateria</nome>
</item>
</dominio>
<pesquisa>pesquisarDominio()</pesquisa>
</propriedade>
<propriedade>
<chave>tempo_dias</chave>
<nome>Tempo em Dias</nome>
<coluna>tempo_dias</coluna>
<tipo>int</tipo>
<obrigatorio>sim</obrigatorio>
</propriedade>
</recurso>
<recurso>
<chave>config_custo_empresa_coligada</chave>
<nome>Configurações de Custos - Empresa Coligada</nome>
<tabela>config_custo_empresa_coligada</tabela>
<heranca>padrao_log</heranca>
<propriedade>
<chave>config_custo</chave>
<nome>Configurações de Custos</nome>
<coluna>config_custo</coluna>
<tipo>int</tipo>
<referencia>config_custo</referencia>
<pesquisa>pesquisarReferencia()</pesquisa>
<obrigatorio>sim</obrigatorio>
</propriedade>
<propriedade>
<chave>empresa_coligada</chave>
<nome>Empresa Coligada</nome>
<coluna>empresa_coligada</coluna>
<tipo>int</tipo>
<referencia>empresa</referencia>
<pesquisa>pesquisarReferencia()</pesquisa>
<pesquisa_validacao>nivel_arvore='i'</pesquisa_validacao>
</propriedade>
</recurso>
</catalogo>Tenho este arquivo e outro do mesmo tipo, e quero saber se existe alguma "propriedade" ou "recurso" diferente do original. Como eu posso proceder? Segue o código:
namespace PrimeDataBuilder
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
}
private void btnSource_Click(object sender, EventArgs e)
{
OpenFileDialog dialogBox = new OpenFileDialog();
if (dialogBox.ShowDialog() == DialogResult.OK)
{
txbOriginalFile.Text = dialogBox.FileName;
}
}
private void btnTarget_Click(object sender, EventArgs e)
{
OpenFileDialog dialogBox = new OpenFileDialog();
if (dialogBox.ShowDialog() == DialogResult.OK)
{
txbCompareWith.Text = dialogBox.FileName;
}
}
private void btnCompare_Click(object sender, EventArgs e)
{
if (txbOriginalFile.Text == null || txbOriginalFile.Text == string.Empty)
{
MessageBox.Show("Nenhum arquivo selecionado, por favor selecione um arquivo original");
return;
}
if (!File.Exists(txbOriginalFile.Text))
{
MessageBox.Show("O arquivo original não existe, por favor selecione outro arquivo");
return;
}
if (txbCompareWith.Text == null || txbCompareWith.Text == string.Empty)
{
MessageBox.Show("Nenhum arquivo de original, por favor selecione um arquivo para se comparado.");
return;
}
if (!File.Exists(txbCompareWith.Text))
{
MessageBox.Show("O arquivo a ser comparado não existe, por favor selecione outro arquivo");
return;
}
DoCompare(txbOriginalFile.Text, txbCompareWith.Text);
}
public void DoCompare(string originalFile, string CompareWithFile)
{
catalogo originalCatalogo = Catalogo.carregarCatalogo(originalFile);
catalogo novoCatalogo = Catalogo.carregarCatalogo(CompareWithFile);
foreach (catalogoRecurso catReq in originalCatalogo.Items)
{
catalogoRecurso cat = novoCatalogo.Items.Where(x => x.chave == catReq.chave).FirstOrDefault();
originalFile = txbOriginalFile.Text;
XElement xml = XElement.Load(originalFile);
txbResult.Text = xml.ToString();
if (!xml.Equals(txbResult.Text))
{
MessageBox.Show("O catalogo de comparação tem propriedades que não existem no catalogo original.");
}
}
//obtem todos os recursos q contém diferenças
List<catalogoRecurso> recursosDivergentes = originalCatalogo.Items.Where(x => !novoCatalogo.Items.Equals(x)).ToList();
}
private void btnScript_Click(object sender, EventArgs e)
{
DoScript(txbOriginalFile.Text, txbCompareWith.Text);
}
private void DoScript(string originalFile, string CompareWithFile)
{
catalogo originalCatalogo = Catalogo.carregarCatalogo(originalFile);
catalogo novoCatalogo = Catalogo.carregarCatalogo(CompareWithFile);
try
{
originalFile = txbOriginalFile.Text;
XElement xml = XElement.Load(originalFile);
txbResult.Text = xml.ToString();
MessageBox.Show("scripts gerado com sucesso.");
string catalogo = string.Empty;
if (txbOriginalFile.Text != txbCompareWith.Text || !(txbOriginalFile.Text != null))
{
catalogo = txbOriginalFile.ToString() + txbCompareWith.ToString();
}
}
catch (Exception)
{
throw;
}
}
}
}
Todas as Respostas
-
E a duvida esta em qual ponto? O seu codigo nao funciona?
aqui alguns artigos que podem ser uteis:
http://www.codeproject.com/Articles/45233/Diff-in-XML-files-with-LINQ
http://msdn.microsoft.com/en-us/library/aa302294.aspx
http://comparenetobjects.codeplex.com/
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
Ele compila e funciona, mas do jeito que implementei ele não compara estes dois arquivos .xml (OriginalFile, CompareWith). Quero uma ajuda de como eu possa usar algum método ou função para comparar este dois arquivos e mostrar na tela, pro usuário.
-
O que seu codigo faz é comparar o texto.. o que nao é muito efetivo no caso de um XML..
PAra comparar XML vc tem que comparar nó à nó...
O primeiro artigo que eu lhe enviei faz exatamente isso:
http://www.codeproject.com/Articles/45233/Diff-in-XML-files-with-LINQ
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------