Comparação Xml em C #

Eu estou tentando comparar dois arquivos Xml usando o código c #. Eu quero ignorar as diferenças de syntax Xml (ou seja, nomes de prefixo). Para isso, estou usando a API XML Diff e Patch C # da Microsoft. Ele funciona para alguns Xml, mas não consegui encontrar uma maneira de configurá-lo para trabalhar com os dois Xmls a seguir:

XML A:

 1  

XML B:

  1  

Minhas perguntas são:

  1. Estou certo de que esses dois xml‘s são semanticamente iguais (ou isomórficos)?
  2. A API XML Diff and Patch da Microsoft pode ser configurada para suportá-lo?
  3. Existem outros utilitários C # para isso?

Os documentos são isomórficos, como pode ser mostrado no programa abaixo. Eu acho que se você usar XmlDiffOptions.IgnoreNamespaces e XmlDiffOptions.IgnorePrefixes para configurar o Microsoft.XmlDiffPatch.XmlDiff , você obtém o resultado desejado.

 using System.Linq; using System.Xml.Linq; namespace SO_794331 { class Program { static void Main(string[] args) { var docA = XDocument.Parse( @"1"); var docB = XDocument.Parse( @"1"); var rootNameA = docA.Root.Name; var rootNameB = docB.Root.Name; var equalRootNames = rootNameB.Equals(rootNameA); var descendantsA = docA.Root.Descendants(); var descendantsB = docB.Root.Descendants(); for (int i = 0; i < descendantsA.Count(); i++) { var descendantA = descendantsA.ElementAt(i); var descendantB = descendantsB.ElementAt(i); var equalChildNames = descendantA.Name.Equals(descendantB.Name); var valueA = descendantA.Value; var valueB = descendantB.Value; var equalValues = valueA.Equals(valueB); } } } } 

Eu sei que seu foco não está nos testes unitários, mas o XMLUnit pode comparar dois arquivos XML e acho que é capaz de resolver seu exemplo. Talvez você possa ver o código e descobrir sua solução.

Eu tenho uma resposta por Martin Honnen em XML e no MSDN Framework MSDN Forum. Em suma, ele sugere o uso da function deep-equal do XQuery 1.0 e fornece algumas implementações de C #. Parece funcionar.

Pode ser uma ideia carregar as instâncias XmlDocument de cada arquivo xml e comparar o DOM XML em vez disso? Fornecer a validação correta é feita em cada um, o que deve fornecer um ponto em comum para uma comparação e deve permitir relatórios de diferença padrão. Possivelmente, até mesmo a capacidade de atualizar um do outro com o delta.

Esses documentos não são semanticamente equivalentes. O elemento de nível superior do primeiro está no espaço de nomes http://myNS , enquanto o elemento de nível superior do segundo está no espaço de nomes padrão.

Os elementos filho dos dois documentos são equivalentes. Mas os documentos em si não são.

Editar:

Há um mundo de diferença entre xmls:ns='http://myNS' e xmlns='http://myNS' , que pareço ter ignorado. De qualquer forma, esses documentos são semanticamente equivalentes e estou enganado.