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)
{