diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 32132b0d6a..81276ea545 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -765,6 +765,7 @@ + diff --git a/src/Umbraco.Core/Xml/XPathNavigatorExtensions.cs b/src/Umbraco.Core/Xml/XPathNavigatorExtensions.cs new file mode 100644 index 0000000000..51b387b981 --- /dev/null +++ b/src/Umbraco.Core/Xml/XPathNavigatorExtensions.cs @@ -0,0 +1,30 @@ +using System.Xml.XPath; + +namespace Umbraco.Core.Xml +{ + /// + /// Provides extensions to XPathNavigator. + /// + internal static class XPathNavigatorExtensions + { + /// + /// Selects a node set, using the specified XPath expression. + /// + /// A source XPathNavigator. + /// An XPath expression. + /// A set of XPathVariables. + /// An iterator over the nodes matching the specified expression. + public static XPathNodeIterator Select(this XPathNavigator navigator, string expression, params XPathVariable[] variables) + { + if (variables == null || variables.Length == 0 || variables[0] == null) + return navigator.Select(expression); + + var compiled = navigator.Compile(expression); + var context = new DynamicContext(); + foreach (var variable in variables) + context.AddVariable(variable.Name, variable.Value); + compiled.SetContext(context); + return navigator.Select(compiled); + } + } +} diff --git a/src/Umbraco.Core/Xml/XmlNodeExtensions.cs b/src/Umbraco.Core/Xml/XmlNodeExtensions.cs index 2dbf8775f2..e6021f28d6 100644 --- a/src/Umbraco.Core/Xml/XmlNodeExtensions.cs +++ b/src/Umbraco.Core/Xml/XmlNodeExtensions.cs @@ -1,24 +1,16 @@ using System.Collections.Generic; using System.Linq; using System.Xml; -using System.Xml.XPath; // source: mvpxml.codeplex.com namespace Umbraco.Core.Xml { + /// + /// Provides extensions to XmlNode. + /// internal static class XmlNodeExtensions { - static XPathNodeIterator Select(string expression, XPathNavigator source, params XPathVariable[] variables) - { - var expr = source.Compile(expression); - var context = new DynamicContext(); - foreach (var variable in variables) - context.AddVariable(variable.Name, variable.Value); - expr.SetContext(context); - return source.Select(expr); - } - /// /// Selects a list of XmlNode matching an XPath expression. /// @@ -54,7 +46,7 @@ namespace Umbraco.Core.Xml if (variables == null || variables.Length == 0 || variables[0] == null) return source.SelectNodes(expression); - var iterator = Select(expression, source.CreateNavigator(), variables); + var iterator = source.CreateNavigator().Select(expression, variables); return XmlNodeListFactory.CreateNodeList(iterator); } diff --git a/src/Umbraco.Core/XmlHelper.cs b/src/Umbraco.Core/XmlHelper.cs index 3e67f2728e..89062b9eb1 100644 --- a/src/Umbraco.Core/XmlHelper.cs +++ b/src/Umbraco.Core/XmlHelper.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Xml; +using System.Xml.XPath; using Umbraco.Core.IO; namespace Umbraco.Core @@ -14,6 +15,28 @@ namespace Umbraco.Core /// public class XmlHelper { + /// + /// Gets a value indicating whether a specified string contains only xml whitespace characters. + /// + /// The string. + /// true if the string contains only xml whitespace characters. + /// As per XML 1.1 specs, space, \t, \r and \n. + public static bool IsXmlWhitespace(string s) + { + // as per xml 1.1 specs - anything else is significant whitespace + s = s.Trim(' ', '\t', '\r', '\n'); + return s.Length == 0; + } + + /// + /// Creates a new XPathDocument from an xml string. + /// + /// The xml string. + /// An XPathDocument created from the xml string. + public static XPathDocument CreateXPathDocument(string xml) + { + return new XPathDocument(new XmlTextReader(new StringReader(xml))); + } public static string StripDashesInElementOrAttributeNames(string xml) {