using System; using System.Linq; using System.Xml; using JetBrains.Annotations; using WireMock.Validation; #if !NETSTANDARD1_3 using Wmhelp.XPath2; #endif namespace WireMock.Matchers { /// /// XPath2Matcher /// /// public class XPathMatcher : IStringMatcher { private readonly string[] _patterns; /// /// Initializes a new instance of the class. /// /// The patterns. public XPathMatcher([NotNull] params string[] patterns) { Check.NotNull(patterns, nameof(patterns)); _patterns = patterns; } /// public double IsMatch(string input) { if (input == null) { return MatchScores.Mismatch; } try { var nav = new XmlDocument { InnerXml = input }.CreateNavigator(); #if NETSTANDARD1_3 return MatchScores.ToScore(_patterns.Select(p => true.Equals(nav.Evaluate($"boolean({p})")))); #else return MatchScores.ToScore(_patterns.Select(p => true.Equals(nav.XPath2Evaluate($"boolean({p})")))); #endif } catch (Exception) { return MatchScores.Mismatch; } } /// public string[] GetPatterns() { return _patterns; } /// public string GetName() { return "XPathMatcher"; } } }