XML programático Diff/Merge en C#
(1)
Después de un par de días de perder el tiempo, encontré una solución que creo que me funciona. Tal vez podría funcionar para otras personas también.
La herramienta MS XML Diff and Patch era una opción viable. Cuando se difumina el primer archivo con respecto al segundo, se crea un "DiffGram" XML que enumera los cambios que detectó entre los dos archivos XML.
Para encargarme de las 3 reglas que enumeré anteriormente, di los dos archivos en una dirección, luego abrí el archivo DiffGram usando Linq-to-XML y eliminé todas las líneas "Agregar" y "Eliminar".
XNamespace xd = "http://schemas.microsoft.com/xmltools/2002/xmldiff";
var doc = XDocument.Load(_diffGramFile);
doc.Root.DescendantsAndSelf(xd + "add").Remove();
doc.Root.DescendantsAndSelf(xd + "remove").Remove();
Luego reparé (fusioné) este diagrama de diferencias editado en el primer archivo y creé un archivo temporal parcialmente fusionado. Esto se encarga de las reglas 1 y 2.
A continuación, di el archivo parcialmente fusionado contra el primer archivo utilizado. Luego abrió el nuevo DiffGram y eliminó todas las referencias de Cambio a "UseExistingValue".
var newdoc = XDocument.Load(_diffGramFile);
newdoc.Root.DescendantsAndSelf(xd + "change")
.Where(x => x.Value == "UseExistingValue").Remove();
Y fusionó este DiffGram editado con el archivo parcialmente fusionado que se ocupa de la Regla 3. Al guardar esto en XML, se produce el XML final fusionado de acuerdo con las reglas definidas anteriormente.
Esperemos que esto pueda ayudar a otras personas.
SUGERENCIA: Después de instalar la biblioteca XmlDiffPatch, la DLL XmlDiffPatch se puede encontrar en C: / Windows / assembly / GAC / XmlDiffPatch / 1.0.8.28__b03f5f7f11d50a3a / XmlDiffPatch.dll
En este momento, estoy administrando una pieza de software que tiene varios archivos de configuración XML. Cuando se lanza una nueva versión del software, a veces los archivos de configuración base cambian, actualmente tenemos el software llamado KDiff en el inicio. Si detecta un cambio, solicita al usuario que elija los cambios.
El problema con este enfoque es que KDiff es un programa de comparación de líneas y no es consciente de las formas de XML (como Nodos, etc.)
Idealmente, me gustaría trabajar mediante programación con una biblioteca en C # (ya que somos una tienda de MS) que puede Difundir dos archivos XML: un XML de origen y un XML de trabajo actual.
Y luego fusiona los dos juntos con unas pocas reglas simples:
- Si el XML de trabajo actual tiene un nodo que el XML de origen no lo tiene, elimínelo.
- Si el XML de origen tiene un nodo que el XML de trabajo actual no tiene, agréguelo.
- Si ambos tienen el mismo nodo y los valores difieren, favorece el valor del XML de origen, a menos que el valor del XML de origen se establezca en "UseExistingValue".
Por ejemplo, aquí está el XML de "Fuente":
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="UseExistingValue" Y="UseExistingValue" Z="UseExistingValue" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
Y aquí está el XML "Trabajo actual":
<Configuration>
<Items>
<Item Id="1" Position="false">
<Location X="123" Y="234" Z="345" />
<Another/>
<Something/>
</Item>
</Items>
</Configuration>
Y la versión fusionada se vería así:
<Configuration>
<Items>
<Item Id="1" Position="true">
<Location X="123" Y="234" Z="345" />
<Something/>
<SomethingElse/>
</Item>
</Items>
</Configuration>
He examinado la herramienta MS XML Diff y Patch Tool y definitivamente fusiona los archivos, pero no permite las reglas programáticas que quiero definir.
La unidad XML para desarrolladores de Java parece prometedora, pero la versión .NET parece poco desarrollada, lo que es desafortunado.
¿Alguien tiene alguna sugerencia para las herramientas XML Diff / Merge y / o las bibliotecas .NET (pagadas o gratuitas)?
Gracias.