private static void compare(Options options) { XmlDocument doc1 = new XmlDocument(); XmlDocument doc2 = new XmlDocument(); XmlReader reader; reader = new XmlTextReader(options.f1); doc1.Load(reader); reader = new XmlTextReader(options.f2); doc2.Load(reader); reader = null; SortedLookup lookup = new SortedLookup(); lookup.LookupPath = options.p1; lookup.SortPath = options.sortPath; XmlNodeList nodes1 = lookup.PerformSortedLookup(doc1); XmlNodeList nodes2 = lookup.PerformSortedLookup(doc2); ICompareStrategy compareStrategy = new NameCompareStrategy(); //$ HARD-CODED ArrayList nodeVisitors = new ArrayList(); if (options.performList) { nodeVisitors.Add(new NodeLister(options.f1, options.f2)); } //$ if ( options.performDiff ) //$ nodeVisitors.Add(new NodeDiffer(options.f1, options.f2)); foreach (object v in nodeVisitors) { NodesVisitor visitor = (NodesVisitor)v; applyVisitors(visitor, nodes1, nodes2, compareStrategy); } }
private static void applyVisitors(NodesVisitor visitor, XmlNodeList nodes1, XmlNodeList nodes2, ICompareStrategy compareStrategy) { ArrayList leftNodes = new ArrayList(); ArrayList leftKeys = new ArrayList(); ArrayList rightNodes = new ArrayList(); ArrayList rightKeys = new ArrayList(); foreach (XmlNode node in nodes1) { string key = compareStrategy.GetSortValue(node); leftNodes.Add(node); leftKeys.Add(key); } foreach (XmlNode node in nodes2) { string key = compareStrategy.GetSortValue(node); rightNodes.Add(node); rightKeys.Add(key); } int idxLeft = 0; int idxRight = 0; visitor.Initialize(); while (idxLeft < leftKeys.Count || idxRight < rightKeys.Count) { string leftKey, rightKey; XmlNode leftNode = null, rightNode = null; if (idxLeft < leftKeys.Count) { if (idxRight < rightKeys.Count) { leftKey = (string)leftKeys[idxLeft]; leftNode = (XmlNode)leftNodes[idxLeft]; rightKey = (string)rightKeys[idxRight]; rightNode = (XmlNode)rightNodes[idxRight]; if (leftKey.CompareTo(rightKey) < 0) { rightKey = ""; rightNode = null; ++idxLeft; } else if (leftKey.CompareTo(rightKey) > 0) { leftKey = ""; leftNode = null; ++idxRight; } else { ++idxLeft; ++idxRight; } } else { leftKey = (string)leftKeys[idxLeft]; leftNode = (XmlNode)leftNodes[idxLeft]; rightKey = ""; rightNode = null; ++idxLeft; } } else { leftKey = ""; leftNode = null; rightKey = (string)rightKeys[idxRight]; rightNode = (XmlNode)rightNodes[idxRight]; ++idxRight; } visitor.visitNodes(leftNode, leftKey, rightNode, rightKey); } visitor.Uninitialize(); }