private bool CompareText(XPathNavigator xmlFromNav, XPathNavigator xmlToNav, out XmlDiffNode result, ref int diffNumber) { XPathNavigator xFrom = xmlFromNav.Clone(); XPathNavigator xTo = xmlToNav.Clone(); result = new XmlDiffNode(); if (xFrom.NodeType == XPathNodeType.Text && xTo.NodeType == XPathNodeType.Text) { if (!CompareTextValue(xFrom.Value, xTo.Value)) { result = new XmlDiffNode { XPath = GetXPath(xFrom), DiffType = XmlDiffNode.DiffTypes.Changed, Description = "Text node does not match | " + xFrom.Value.Trim() + " => " + xTo.Value.Trim(), DiffNodeType = XmlDiffNode.DiffNodeTypes.Text, Origin = fromFilename, Comparison = toFilename, OriginLineNo = ((IXmlLineInfo)xFrom).LineNumber, CompLineNo = ((IXmlLineInfo)xTo).LineNumber, DiffId = (diffNumber++).ToString() }; return(false); } } return(true); }
private bool MatchElement(XPathNavigator fromNav, XPathNavigator toNav, out XmlDiffNode nodeInfo) { XPathNavigator xFrom = fromNav.Clone(); XPathNavigator xTo = toNav.Clone(); nodeInfo = null; if (!options.IgnoreNamespace && (xFrom.NamespaceURI != xTo.NamespaceURI)) { return(false); } if (!options.IgnorePrefix && (xFrom.Prefix != xTo.Prefix)) { return(false); } if (xFrom.LocalName != xTo.LocalName) { return(false); } if (!options.IgnoreAttributes && !MatchAttributes(xFrom, xTo, out nodeInfo)) { return(false); } if (xFrom.Value.Equals(xTo.Value)) { return(true); } Debug.WriteLine(xFrom.Value); Debug.WriteLine(xTo.Value); Debug.WriteLine("*************"); return(false); }
public string ToString(XmlDiffNode node) { StringBuilder diffLine = new StringBuilder(); diffLine.Append("\"Edit\": "); switch (node.DiffType) { case XmlDiffNode.DiffTypes.Removed: diffLine.AppendLine("\"Delete\","); break; case XmlDiffNode.DiffTypes.Added: diffLine.AppendLine("\"Insert\","); break; case XmlDiffNode.DiffTypes.Changed: diffLine.AppendLine("\"Update\","); break; default: break; } diffLine.AppendLine("\"XPath\": " + "\"" + EscapeQuotes(node.XPath) + "\","); diffLine.AppendLine("\"Diff ID\": " + "\"" + node.DiffId + "\","); diffLine.AppendLine("\"Description\": " + "\"" + EscapeQuotes(node.Description) + "\","); diffLine.AppendLine("\"Node Type\": " + "\"" + node.DiffNodeType + "\","); diffLine.AppendLine("\"Origin Line No\": " + node.OriginLineNo + ","); diffLine.AppendLine("\"Comp Line No\": " + node.CompLineNo + ","); return(diffLine.ToString()); }
private List <XPathNavigator> SelectSiblings(XPathNavigator fromNav, XPathNavigator toNav, out XmlDiffNode nodeInfo) { XPathNavigator xFrom = fromNav.Clone(); XPathNavigator xTo = toNav.Clone(); List <XPathNavigator> xToList = new List <XPathNavigator>(); nodeInfo = null; xTo.MoveToFirst(); if (xTo.NodeType != XPathNodeType.Element) { xTo.MoveToNext(XPathNodeType.Element); } do { if (MatchElement(xFrom, xTo, out nodeInfo)) { xToList.Add(xTo.Clone()); } } while (xTo.MoveToNext(XPathNodeType.Element)); return(xToList); }
private bool MatchAttributes(XPathNavigator fromNav, XPathNavigator toNav, out XmlDiffNode nodeInfo) { XPathNavigator xFrom = fromNav.Clone(); XPathNavigator xTo = toNav.Clone(); nodeInfo = null; if (xFrom.HasAttributes) { xFrom.MoveToFirstAttribute(); if (!options.IgnoreAttributeOrder) { xTo.MoveToFirstAttribute(); } do { if (!options.IgnoreAttributeOrder) { if (!options.IgnoreNamespace && xFrom.Prefix != xTo.Prefix) { nodeInfo = new XmlDiffNode() { XPath = null, DiffType = XmlDiffNode.DiffTypes.Changed, Description = "No matching namespace @" + xFrom.NamespaceURI, DiffNodeType = XmlDiffNode.DiffNodeTypes.Text, Origin = fromFilename, Comparison = toFilename, OriginLineNo = ((IXmlLineInfo)xFrom).LineNumber, CompLineNo = ((IXmlLineInfo)xTo).LineNumber, DiffId = string.Empty, // To be filled in by compare method }; return(false); } if (xFrom.LocalName != xTo.LocalName || xFrom.Value != xTo.Value) { nodeInfo = new XmlDiffNode() { XPath = null, DiffType = XmlDiffNode.DiffTypes.Changed, Description = "No matching attribute @" + xFrom.LocalName + " = " + xFrom.Value, DiffNodeType = XmlDiffNode.DiffNodeTypes.Text, Origin = fromFilename, Comparison = toFilename, OriginLineNo = ((IXmlLineInfo)xFrom).LineNumber, CompLineNo = ((IXmlLineInfo)xTo).LineNumber, DiffId = string.Empty, // To be filled in by compare method }; return(false); } xTo.MoveToNextAttribute(); } else { if (xTo.GetAttribute(xFrom.LocalName, (!options.IgnoreNamespace) ? xFrom.NamespaceURI : "") != xFrom.Value) { nodeInfo = new XmlDiffNode() { XPath = null, DiffType = XmlDiffNode.DiffTypes.Changed, Description = "No matching attribute @" + xFrom.LocalName + " = " + xFrom.Value, DiffNodeType = XmlDiffNode.DiffNodeTypes.Text, Origin = fromFilename, Comparison = toFilename, OriginLineNo = ((IXmlLineInfo)xFrom).LineNumber, CompLineNo = ((IXmlLineInfo)xTo).LineNumber, DiffId = string.Empty, // To be filled in by compare method }; return(false); } } } while (xFrom.MoveToNextAttribute()); } return(true); }