Xpath matching with wiremock.net



我正在尝试匹配wiremock.net模拟服务中的请求主体,并发送特定的响应,只有当"code"标签包含值"01.23.45.678.910"。

这是xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope" 
xmlns:v1="some-url" 
xmlns:com="some-url">
<soapenv:Body>
<v1:TestRequest>
<v1:RequestParameters>
<com:requestorDN>tst</com:requestorDN>
<com:requestID>ece8c518-669e-4a17-840b-62ff4c047f04</com:requestID>
<com:useSoapFaults>1</com:useSoapFaults>
</v1:RequestParameters>
<v1:code>01.23.45.678.910</v1:code>
</v1:TestRequest>
</soapenv:Body>
</soapenv:Envelope>

这是一个没有效果的查询:

/*:Envelope/*:Body/*:TestRequest/*:code[.='01.23.45.678.910']

如何正确匹配?

WireMock的文档提供了一个如何将XML命名空间前缀绑定到XML命名空间URI的示例,以便您可以使用这些命名空间前缀编写XPath表达式。

https://wiremock.org/docs/request-matching/

如果您需要能够在除了它们的名称之外,您还可以声明名称空间URI的前缀映射,并在XPath表达式中使用它们:

Java:

.withRequestBody(matchingXPath("/stuff:outer/more:inner[.=111]")   
.withXPathNamespace("stuff", "http://stuff.example.com")   
.withXPathNamespace("more", "http://more.example.com"))

JSON:

{   "request": {
...
"bodyPatterns" : [ {
"matchesXPath" : "/stuff:outer/more:inner[.=111]",
"xPathNamespaces" : {
"stuff" : "http://stuff.example.com",
"more"  : "http://more.example.com"
}
} ]
...   },   ... }

正如@Xerillio正确指出的那样,您需要使用local-name()函数来忽略名称空间。为了匹配xml标记值,可以使用text()函数。您还可以利用带有通配符//*的节点选择器,该选择器从当前节点中选择与所选内容匹配的节点,无论这些节点位于何处。

以下xpath查询对我有效:

//*[local-name()='v1:code' and text()='01.23.45.678.910']

相关内容

  • 没有找到相关文章

最新更新