diff --git a/XmlDiffLib.Tests/UnitTest1.cs b/XmlDiffLib.Tests/UnitTest1.cs index 34e8033..11a3d96 100644 --- a/XmlDiffLib.Tests/UnitTest1.cs +++ b/XmlDiffLib.Tests/UnitTest1.cs @@ -37,5 +37,52 @@ public void TestXmlDiff() Assert.AreEqual(diff.DiffNodeList.Count, 2); Assert.IsTrue(diff.DiffNodeList[1].Description.Contains("CompanyID")); } + + /// + /// GIVEN an xml structure with a node to be ignored + /// WHEN the xpath is specified that needs to be ignored + /// THEN comparedocument should return true + /// + [TestMethod] + public void TestXmlIgnoreXPathWithValue() + { + // Arrange + string fromXml = "FooBarFoo"; + string toXml = "FooFoo"; + + XmlDiff xmlDiff = new XmlDiff(fromXml, toXml); + + XmlDiffOptions xmlDiffOptions = new XmlDiffOptions(); + xmlDiffOptions.IgnoreXPaths.Add("Root/Node/IgnoreNode"); + + // Act + bool isSame = xmlDiff.CompareDocuments(xmlDiffOptions); + + // Assert + Assert.IsTrue(isSame); + } + + /// + /// GIVEN an xml structure with a node missing + /// WHEN no xpath to be ignored is not provided + /// THEN comparedocument should return false + /// + [TestMethod] + public void TestXmlIgnoreXPathWithoutValue() + { + // Arrange + string fromXml = "FooBarFoo"; + string toXml = "FooFoo"; + + XmlDiff xmlDiff = new XmlDiff(fromXml, toXml); + + XmlDiffOptions xmlDiffOptions = new XmlDiffOptions(); + + // Act + bool isSame = xmlDiff.CompareDocuments(xmlDiffOptions); + + // Assert + Assert.IsFalse(isSame); + } } } diff --git a/XmlDiffLib/XmlDiff.cs b/XmlDiffLib/XmlDiff.cs index b30ec21..2cc2251 100644 --- a/XmlDiffLib/XmlDiff.cs +++ b/XmlDiffLib/XmlDiff.cs @@ -35,6 +35,7 @@ public enum IgnoreTextNodeOptions { XmlString, XmlInteger, XmlDouble, XmlDateTim public bool IgnoreChildOrder { get; set; } public bool IgnoreAttributes { get; set; } public HashSet IgnoreNodes { get; set; } + public HashSet IgnoreXPaths { get; set; } public bool IgnoreNamespace { get; set; } public bool IgnorePrefix { get; set; } public bool TrimWhitespace { get; set; } @@ -59,6 +60,7 @@ public XmlDiffOptions() MatchValueTypes = true; TwoWayMatch = false; IgnoreNodes = new HashSet(); + IgnoreXPaths = new HashSet(); IgnoreTextTypes = new HashSet(); MaxAttributesToDisplay = -1; } @@ -275,8 +277,11 @@ private List CompareNodes(XPathNavigator xmlFromNav, XPathNavigator do { - if (options.IgnoreNodes.Contains(xFrom.NodeType)) - continue; + if (options.IgnoreNodes.Contains(xFrom.NodeType) || + options.IgnoreXPaths.Contains(GetXPath(xFrom, false))) + { + continue; + } XmlDiffNode nodeInfo; if (!options.IgnoreChildOrder) @@ -495,7 +500,7 @@ private bool CompareTextValue(string fromValue, string toValue) return true; } - private string GetXPath(XPathNavigator nav) + private string GetXPath(XPathNavigator nav, bool addNodePosition = true) { Func addAttrib = (node) => @@ -525,7 +530,7 @@ private string GetXPath(XPathNavigator nav) if (string.IsNullOrEmpty(xNav.LocalName)) continue; string tempLabel = xNav.LocalName + addAttrib(xNav); - tempLabel += "[" + GetSiblingPosition(xNav) + "]"; + if (addNodePosition) { tempLabel += "[" + GetSiblingPosition(xNav) + "]"; } tempLabel += "/"; result.Insert(0, tempLabel);