From f867c532572299242d41019dd28b7e6028bcaa84 Mon Sep 17 00:00:00 2001 From: Joel Martinez Date: Thu, 5 Mar 2020 16:37:08 -0500 Subject: [import] fixed issue with xpath --- mdoc/Mono.Documentation/Updater/DocUtils.cs | 26 ++++++++++++++++++--- mdoc/mdoc.Test/DocUtilsTests.cs | 35 ++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/mdoc/Mono.Documentation/Updater/DocUtils.cs b/mdoc/Mono.Documentation/Updater/DocUtils.cs index 8af7befd..16101987 100644 --- a/mdoc/Mono.Documentation/Updater/DocUtils.cs +++ b/mdoc/Mono.Documentation/Updater/DocUtils.cs @@ -5,7 +5,7 @@ using System.IO; using System.Linq; using System.Text; using System.Xml; - +using System.Xml.XPath; using Mono.Cecil; using Mono.Collections.Generic; using Mono.Documentation.Util; @@ -265,6 +265,8 @@ namespace Mono.Documentation.Updater { if (n is XmlText && n.InnerText == "To Be Added.") return false; + else if (n is XmlComment) + return false; else { bool removed = true; @@ -272,14 +274,32 @@ namespace Mono.Documentation.Updater { if (nchild == null) continue; + if (nchild is XmlComment || nchild is XmlText || nchild is XmlCDataSection) + { + nchild.ParentNode.RemoveChild(nchild); + removed = true; + continue; + } + if (depth == 0) { // check the first level children to see if there's an incoming node that matches var avalues = nchild.Attributes?.Cast().Select(a => $"@{a.Name}='{a.Value}'").ToArray(); var nodexpath = $"./{nchild.Name}"; if (avalues?.Length > 0) - nodexpath += $"[{ string.Join(" AND ", avalues) }]"; - var incomingEquivalent = incoming.SelectSingleNode(nodexpath); + nodexpath += $"[{ string.Join(" and ", avalues) }]"; + + XmlNode incomingEquivalent; + + try + { + incomingEquivalent = incoming.SelectSingleNode(nodexpath); + } + catch (XPathException xex) + { + throw new MDocException($"xpath error: {nodexpath}. On incoming node {incoming.OuterXml}", xex); + } + if (incomingEquivalent != null) { nchild.ParentNode.RemoveChild(nchild); diff --git a/mdoc/mdoc.Test/DocUtilsTests.cs b/mdoc/mdoc.Test/DocUtilsTests.cs index d5f01a05..dad76d0e 100644 --- a/mdoc/mdoc.Test/DocUtilsTests.cs +++ b/mdoc/mdoc.Test/DocUtilsTests.cs @@ -65,7 +65,40 @@ namespace mdoc.Test XmlDocument incomingDoc = new XmlDocument(); incomingDoc.LoadXml(xml2); DocUtils.ClearNodesIfNotDefault(doc.FirstChild, incomingDoc.FirstChild); - Assert.IsTrue(doc.FirstChild.ChildNodes.Count == 3) ; + Assert.IsTrue(doc.FirstChild.ChildNodes.Count == 3); + } + + [Test] + public void TestNodeCleaner2() + { + string xml = @" + To be added. + To be added. + + written docs +random text +Written but not provided + +"; string xml2 = @" + new summary + + To be added. + random text + written docs but changed +Written but and + +"; + XmlDocument doc = new XmlDocument(); + doc.LoadXml(xml); + + XmlDocument incomingDoc = new XmlDocument(); + incomingDoc.LoadXml(xml2); + DocUtils.ClearNodesIfNotDefault(doc.FirstChild, incomingDoc.FirstChild); + Assert.IsTrue(doc.FirstChild.ChildNodes.Count == 0); } } } \ No newline at end of file -- cgit v1.2.3