private DiffResult PerformDiff(TextReader reader1, TextReader reader2)
        {
            _xmlDiff = new LiftIO.Merging.XmlDiff.XmlDiff(reader1, reader2);
            DiffResult result = _xmlDiff.Compare();

            return(result);
        }
Exemple #2
0
        private void ComputeDiff(TextReader original, TextReader modified, IProgress progress)
        {
            //enchance: just get a checksum for each entry in both files, use that to determine everything else

            _idsOfDeletedEntries = new List <string>();
            _idsOfAddedEntries   = new List <string>();
            _idsOfEditedEntries  = new List <string>();
            _idsInOriginal       = new List <string>();

            System.Xml.XPath.XPathDocument modifiedDoc = new XPathDocument(modified);
            XPathNavigator modifiedNav = modifiedDoc.CreateNavigator();


            System.Xml.XPath.XPathDocument originalDoc = new XPathDocument(original);
            XPathNavigator    originalNav = originalDoc.CreateNavigator();
            XPathNodeIterator liftElement = originalNav.SelectChildren(XPathNodeType.Element);

            liftElement.MoveNext();//move to the one and only <lift> element
            XPathNodeIterator originalChildren = liftElement.Current.SelectChildren(XPathNodeType.Element);
            StringDictionary  idToContentsOfModifiedEntries = new StringDictionary();

            XPathNodeIterator liftOfModifiedFile = modifiedNav.SelectChildren(XPathNodeType.Element);

            liftOfModifiedFile.MoveNext();
            XPathNodeIterator modifiedChildren = liftOfModifiedFile.Current.SelectChildren(XPathNodeType.Element);

            while (modifiedChildren.MoveNext())
            {
                //TODO: consider if there are benefits to using guid as the first key, then try id
                string id = modifiedChildren.Current.GetAttribute("id", string.Empty);
                idToContentsOfModifiedEntries.Add(id, modifiedChildren.Current.OuterXml);
            }

            while (originalChildren.MoveNext())
            {
                string id = originalChildren.Current.GetAttribute("id", string.Empty);
                _idsInOriginal.Add(id);

                if (!idToContentsOfModifiedEntries.ContainsKey(id))
                {
                    _idsOfDeletedEntries.Add(id);
                }
                else
                {
                    XmlDiff.XmlDiff diff   = new LiftIO.Merging.XmlDiff.XmlDiff(originalChildren.Current.OuterXml, idToContentsOfModifiedEntries[id]);
                    DiffResult      result = diff.Compare();
                    if (!result.AreEqual)
                    {
                        _idsOfEditedEntries.Add(id);
                    }
                }
            }
            foreach (string id in idToContentsOfModifiedEntries.Keys)
            {
                if (!_idsInOriginal.Contains(id))
                {
                    _idsOfAddedEntries.Add(id);
                }
            }
        }
Exemple #3
0
 //was public, but jh didn't see why
 internal void DifferenceFound(XmlDiff inDiff, Difference difference)
 {
     _areIdentical = false;
     if (difference.HasMajorDifference) {
         _areEqual = false;
     }
     _difference = difference;
     if (_stringBuilder.Length == 0) {
         _stringBuilder.Append(inDiff.OptionalDescription);
     }
     _stringBuilder.Append(Environment.NewLine).Append(difference);
 }
Exemple #4
0
 public static bool AreXmlElementsEqual(XmlNode ours, XmlNode theirs)
 {
     if (ours.NodeType == XmlNodeType.Text)
     {
         if (ours.NodeType != XmlNodeType.Text)
         {
             return false;
         }
         bool oursIsEmpty = (ours.InnerText == null || ours.InnerText.Trim() == string.Empty);
         bool theirsIsEmpty = (theirs.InnerText == null || theirs.InnerText.Trim() == string.Empty);
         if(oursIsEmpty != theirsIsEmpty)
         {
             return false;
         }
         return ours.InnerText.Trim() == theirs.InnerText.Trim();
     }
        // DiffConfiguration config = new DiffConfiguration(WhitespaceHandling.None);
     XmlDiff diff = new XmlDiff(new XmlInput(ours.OuterXml), new XmlInput(theirs.OuterXml));//, config);
     DiffResult d = diff.Compare();
     return (d == null || d.Difference == null || !d.Difference.HasMajorDifference);
 }
        private void ComputeDiff(TextReader original, TextReader modified, IProgress progress)
        {
            //enchance: just get a checksum for each entry in both files, use that to determine everything else

            _idsOfDeletedEntries = new List<string>();
            _idsOfAddedEntries = new List<string>();
            _idsOfEditedEntries = new List<string>();
            _idsInOriginal = new List<string>();

            System.Xml.XPath.XPathDocument modifiedDoc = new XPathDocument(modified);
            XPathNavigator modifiedNav = modifiedDoc.CreateNavigator();

            System.Xml.XPath.XPathDocument originalDoc = new XPathDocument(original);
            XPathNavigator originalNav = originalDoc.CreateNavigator();
            XPathNodeIterator liftElement = originalNav.SelectChildren(XPathNodeType.Element);
            liftElement.MoveNext();//move to the one and only <lift> element
            XPathNodeIterator originalChildren = liftElement.Current.SelectChildren(XPathNodeType.Element);
            StringDictionary idToContentsOfModifiedEntries = new StringDictionary();

            XPathNodeIterator liftOfModifiedFile = modifiedNav.SelectChildren(XPathNodeType.Element);
            liftOfModifiedFile.MoveNext();
            XPathNodeIterator modifiedChildren = liftOfModifiedFile.Current.SelectChildren(XPathNodeType.Element);
            while (modifiedChildren.MoveNext())
            {
                //TODO: consider if there are benefits to using guid as the first key, then try id
                string id = modifiedChildren.Current.GetAttribute("id", string.Empty);
                idToContentsOfModifiedEntries.Add(id, modifiedChildren.Current.OuterXml);
            }

            while (originalChildren.MoveNext())
            {
                string id = originalChildren.Current.GetAttribute("id", string.Empty);
                _idsInOriginal.Add(id);

                if(!idToContentsOfModifiedEntries.ContainsKey(id))
                {
                    _idsOfDeletedEntries.Add(id);
                }
                else
                {
                    XmlDiff.XmlDiff diff = new LiftIO.Merging.XmlDiff.XmlDiff(originalChildren.Current.OuterXml, idToContentsOfModifiedEntries[id]);
                    DiffResult result = diff.Compare();
                    if (!result.AreEqual)
                    {
                        _idsOfEditedEntries.Add(id);
                    }
                }
            }
            foreach (string id in idToContentsOfModifiedEntries.Keys)
            {
                if(!_idsInOriginal.Contains(id))
                    _idsOfAddedEntries.Add(id);
            }
        }