【问题标题】:xpath matching not working for queryparametersxpath 匹配不适用于查询参数
【发布时间】:2020-05-25 15:31:02
【问题描述】:

我试图在查询参数的 xpath 匹配中添加 AND 条件,但它不起作用。

我正在创建多个存根,其中 uniqueId 可以包含同样的数字 00000 或 11111,但 serviceName 会有所不同。例如,在第一个请求中,uniqueId 为 1000001 且 serviceName='ABC',在第二个请求中,uniqueId 再次为 1000001 且 serviceName 为 'XYZ'。因为这两种反应会有所不同。我创建了三个存根,一个用于服务 ABC,第二个用于服务 XYZ,第三个是默认的,没有和 xpath 匹配。 当我使用包含 uniqueId 1000001 和 serviceName ABC 或 XYZ 的查询参数调用服务时,每次我得到默认存根的响应。 在查询参数中传递 xml

"queryParameters":{
      "xmlreqdoc": {
        "matchesXPath" : "//*[[local-name()='uniqueId'][text()[contains(.,'00000')]] AND //*[local-name()='serviceName'][text() = 'ABCDEFGH']]"
      }
    }

我已经创建了具有优先级的存根.. 并且似乎每次都返回默认值。以下是请求xml

<?xml version="1.0" encoding="UTF-8"?>
<service>
<serviceHeader>
<userId>XXXX</userId>
<password>XXXXX</password>
<serviceName>ABCDEFGH</serviceName>
</serviceHeader>
<serviceBody>
<subServiceName>add</subServiceName>
<uniqueId>00000</uniqueId>
</serviceBody>
</service>

下面是我创建的存根映射

{
  "priority" : 1,
  "request": {
    "urlPath": "/testMappings",
    "method": "GET",
    "headers": {
      "Content-Type": {
        "equalTo": "application/xml"
      },
      "Accept": {
        "equalTo": "application/xml"
      }
    },
    "queryParameters":{
      "xmlreqdoc": {
        "matchesXPath" : "//*[//[local-name()='uniqueId'][text()[contains(.,'00000')]] AND //*[local-name()='serviceName'][text() = 'ABCDEFGH']]"
      }
    }
  },
  "response": {
    "status": 400,
    "headers": {
      "Content-Type" : "application/xml"
    },
    "fixedDelayMilliseconds": 500,
    "bodyFileName": "ERROR.xml"
  }
}

任何帮助或指示将不胜感激。提前致谢!!

【问题讨论】:

    标签: xpath wiremock


    【解决方案1】:

    您已经告诉我们您尝试过的错误语法,但您没有告诉我们您想要达到的目标,所以我们可以告诉您您做错了什么,但我们无法告诉您如何让它正确。

    "//*[//[local-name()='uniqueId'][text()[contains(.,'00000')]] AND //*[local-name()='serviceName'][text() = 'ABCDEFGH']]"
    

    这里明显有问题的地方:

    • // 后跟一个谓词
    • 在不涉及命名空间时对 local-name() 进行不必要的匹配
    • 不必要地使用text()
    • 在可以使用 = 时不必要地使用 contains()
    • AND 应该是 and

    也许你想要//uniqueId = '00000' and //serviceName = 'ABCDEFGH'

    【讨论】:

    • 迈克尔,我会试试你分享的指针。同时我在这里需要 contains() ,因为我想要模式匹配,例如uniqueId 的值可以是 230000012、2132222245(2 的组合)。我可以在不同的请求中有不同的服务名称,因此我需要匹配 uniqueId 和 serviceName。不同的服务可能有同样的 uniqueId。
    • 我建议您尝试用完整的需求描述和更完整的示例来更新您的问题,而不是像这样滴灌信息。
    • 我在询问中添加了更多描述,可能是因为语法错误我没有得到想要的结果。不小心粘贴了一个有编译错误的代码部分。然而,Wiremock Standalone 开始了,但是当我请求数据时,我没有得到预期的结果
    • 我在 wiremock 控制台中看到警告警告:无法评估 XPath 表达式 //uniqueId = '00000' 和 //serviceName = 'ABCDEFGH'
    • 该表达式返回一个布尔值。也许软件需要一个返回节点集的 XPath 表达式。您还没有解释您希望 XPath 表达式返回什么。
    【解决方案2】:
    //*[uniqueId[contains(text(),'00000')] and //serviceName='ABCDEFGH']
    

    为我工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多