public ActionResult Diff(string sourceXml, string targetXml) { try { var doc1 = new XmlDocument(); doc1.LoadXml(sourceXml); var doc2 = new XmlDocument(); doc2.LoadXml(targetXml); var tree1 = new XTree(doc1); var tree2 = new XTree(doc2); XDiff.Diff(tree1, tree2); var writer = new XdtDiffWriter(); var patch = writer.GetDiff(tree2); return Content(Beautify(patch), "text/xml"); } catch (Exception e) { return ErrorXml(e.Message); } }
static int Main(string[] args) { var version = Assembly.GetEntryAssembly().GetName().Version; Console.WriteLine( "==================\n" + string.Format(" FatAntelope v{0}.{1}\n", version.Major, version.Minor) + "==================\n"); if (args == null || args.Length < 3 || args.Length > 4) { Console.WriteLine( "Error: Unexpected number of paramters.\n" + "Usage: FatAntelope source-file target-file output-file [transformed-file]\n" + " source-file : (Input) The original config file\n" + " target-file : (Input) The final config file\n" + " output-file : (Output) The output config transform patch file\n" + " transformed-file : (Optional Output) The config file resulting from applying the output-file to the source-file\n" + " This file should be semantically equal to the target-file.\n"); return (int)ExitCode.InvalidParameters; } Console.WriteLine("- Building xml trees . . .\n"); var tree1 = BuildTree(args[0]); var tree2 = BuildTree(args[1]); Console.WriteLine("- Comparing xml trees . . .\n"); XDiff.Diff(tree1, tree2); if (tree1.Root.Match == MatchType.Match && tree2.Root.Match == MatchType.Match && tree1.Root.Matching == tree2.Root) { Console.WriteLine("Warning: No difference found!\n"); return (int)ExitCode.NoDifference; } if (tree1.Root.Match == MatchType.NoMatch || tree2.Root.Match == MatchType.NoMatch) { Console.Error.WriteLine("Error: Root nodes must have the same name!\n"); return (int)ExitCode.RootNodeMismatch; } Console.WriteLine("- Writing XDT transform . . .\n"); var writer = new XdtDiffWriter(); var patch = writer.GetDiff(tree2); patch.Save(args[2]); if (args.Length > 3) { Console.WriteLine("- Applying transform to source . . .\n"); var source = new XmlTransformableDocument(); source.Load(args[0]); var transform = new XmlTransformation(patch.OuterXml, false, null); transform.Apply(source); source.Save(args[3]); } Console.WriteLine("- Finished successfully!\n"); return (int)ExitCode.Success; }
private void AssertCanTransform(string sourceXml, string targetXml) { var doc1 = new XmlDocument(); doc1.LoadXml(sourceXml); // reordered xml but same values var doc2 = new XmlDocument(); doc2.LoadXml(targetXml); var tree1 = new XTree(doc1); var tree2 = new XTree(doc2); XDiff.Diff(tree1, tree2); var writer = new XdtDiffWriter(); var patch = writer.GetDiff(tree2); var transformed = Transform(doc1, patch); var transformedTree = new XTree(transformed); Assert.IsFalse(Enumerable.SequenceEqual(tree1.Root.Hash, tree2.Root.Hash)); Assert.IsTrue(Enumerable.SequenceEqual(transformedTree.Root.Hash, tree2.Root.Hash)); }
private XmlDocument GetPatch(string sourceXml, string targetXml) { var doc1 = new XmlDocument(); doc1.LoadXml(sourceXml); // reordered xml but same values var doc2 = new XmlDocument(); doc2.LoadXml(targetXml); var tree1 = new XTree(doc1); var tree2 = new XTree(doc2); XDiff.Diff(tree1, tree2); var writer = new XdtDiffWriter(); return writer.GetDiff(tree2); }