mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-17 23:14:23 +01:00
Feature/xpath transformer (#398)
* XPath transformer, added handlerbars helper to select nodes using xpath and setting the outerxml value in response * Added test to select attribute value and node text * Removed extra empty lines
This commit is contained in:
committed by
Stef Heyenrath
parent
3f802c3948
commit
368fdd4c7d
@@ -17,6 +17,8 @@ namespace WireMock.Transformers
|
||||
|
||||
HandleBarsXeger.Register(handlebarsContext);
|
||||
|
||||
HandleBarsXPath.Register(handlebarsContext);
|
||||
|
||||
HandleBarsFile.Register(handlebarsContext, fileSystemHandler);
|
||||
}
|
||||
}
|
||||
|
||||
102
src/WireMock.Net/Transformers/HandleBarsXPath.cs
Normal file
102
src/WireMock.Net/Transformers/HandleBarsXPath.cs
Normal file
@@ -0,0 +1,102 @@
|
||||
using HandlebarsDotNet;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.XPath;
|
||||
using WireMock.Validation;
|
||||
#if !NETSTANDARD1_3
|
||||
using Wmhelp.XPath2;
|
||||
#endif
|
||||
|
||||
namespace WireMock.Transformers
|
||||
{
|
||||
internal static class HandleBarsXPath
|
||||
{
|
||||
public static void Register(IHandlebars handlebarsContext)
|
||||
{
|
||||
handlebarsContext.RegisterHelper("XPath.SelectSingleNode", (writer, context, arguments) =>
|
||||
{
|
||||
(XPathNavigator nav, string xpath) = ParseArguments(arguments);
|
||||
|
||||
try
|
||||
{
|
||||
#if NETSTANDARD1_3
|
||||
var result = nav.SelectSingleNode(xpath);
|
||||
#else
|
||||
var result = nav.XPath2SelectSingleNode(xpath);
|
||||
#endif
|
||||
writer.WriteSafeString(result.OuterXml);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// Ignore Exception
|
||||
}
|
||||
});
|
||||
|
||||
handlebarsContext.RegisterHelper("XPath.SelectNodes", (writer, context, arguments) =>
|
||||
{
|
||||
(XPathNavigator nav, string xpath) = ParseArguments(arguments);
|
||||
|
||||
try
|
||||
{
|
||||
#if NETSTANDARD1_3
|
||||
var result = nav.Select(xpath);
|
||||
#else
|
||||
var result = nav.XPath2SelectNodes(xpath);
|
||||
#endif
|
||||
var resultXml = new StringBuilder();
|
||||
foreach (XPathNavigator node in result)
|
||||
{
|
||||
resultXml.Append(node.OuterXml);
|
||||
}
|
||||
|
||||
writer.WriteSafeString(resultXml);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// Ignore Exception
|
||||
}
|
||||
});
|
||||
|
||||
handlebarsContext.RegisterHelper("XPath.Evaluate", (writer, context, arguments) =>
|
||||
{
|
||||
(XPathNavigator nav, string xpath) = ParseArguments(arguments);
|
||||
|
||||
try
|
||||
{
|
||||
#if NETSTANDARD1_3
|
||||
var result = nav.Evaluate(xpath);
|
||||
#else
|
||||
var result = nav.XPath2Evaluate(xpath);
|
||||
#endif
|
||||
writer.WriteSafeString(result);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// Ignore Exception
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static (XPathNavigator nav, string xpath) ParseArguments(object[] arguments)
|
||||
{
|
||||
Check.Condition(arguments, args => args.Length == 2, nameof(arguments));
|
||||
Check.NotNull(arguments[0], "arguments[0]");
|
||||
Check.NotNullOrEmpty(arguments[1] as string, "arguments[1]");
|
||||
|
||||
XPathNavigator nav;
|
||||
|
||||
switch (arguments[0])
|
||||
{
|
||||
case string stringValue:
|
||||
nav = new XmlDocument { InnerXml = stringValue }.CreateNavigator();
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new NotSupportedException($"The value '{arguments[0]}' with type '{arguments[0]?.GetType()}' cannot be used in Handlebars XPath.");
|
||||
}
|
||||
|
||||
return (nav, (string)arguments[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user