我正在尝试匹配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']
如何正确匹配?
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']