【问题标题】:How come the regular expression extractor in jmeter does not always extract the same value?为什么jmeter中的正则表达式提取器并不总是提取相同的值?
【发布时间】:2012-05-30 16:18:06
【问题描述】:

我有两个 WebService(SOAP) 请求。两个 Web 服务调用的响应在结构上完全相同。对于 Web 服务调用编号 1,它具有以下结构,

  <data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">650</data>

对于网络服务调用号 2,它具有以下结构,

  <data xsi:type="soapenc:string">0</data>
  <data xsi:type="soapenc:string">10203</data>

在每个调用下,我都有一个正则表达式提取器。参考名称不同;但一切都定义完全一样。提取器有以下定义。

Apply to: Main Sample Only
Response Field to check: Body
Regular Expression: <data xsi:type="soapenc:string">(\d+?)</data>
Template: $1$
Match No.: 0

对于 Web 服务调用编号 1,提取器获取的值是 650,这正是我想要的。但是对于 2 号 Web 服务调用,提取器实际上得到的值为 0,这不是我想要的。我想在 Web 服务调用号 2 中得到 10203。我的问题是,为什么正则表达式提取器定义会返回两个不同的结果?


在此先感谢,
蒙特

【问题讨论】:

  • 您为什么要尝试使用正则表达式解析 XML?这是个坏主意 (TM)...
  • 我是 jMeter 的新手。在进行一些谷歌搜索时,其他一些人建议使用正则表达式,这就是我使用正则表达式的原因。你会推荐什么?
  • 我没有使用 jMeter 的经验,但大多数语言都有 XML 库。

标签: regex jmeter


【解决方案1】:

如果您使用的匹配数为零,它将随机为您的正则表达式提取一个值。 0 = 随机匹配,1 = 第一次匹配,2 = 第二次,等等...

【讨论】:

  • 非常感谢您的帮助。通过在其他 Web 服务调用时更改匹配号,现在可以正确提取值。
【解决方案2】:

看起来你已经问过了same question here

  1. 使用 Regular Expression ExtractorXPath Extractor - 如上面 cmets 所述,哪个更适合解析 xml, - 使用单个表达式 - (对于 RegEx 提取器:&lt;data xsi:type="soapenc:string"&gt;(.+?)&lt;/data&gt;,对于 XPath 提取器: //data/text() - 获取所有匹配项。
    然后使用相应的生成变量来访问您需要的匹配项 - 通过${refName_2} 例如(访问通过查询提取到 refName 变量的第二个匹配项),这对于 RegEx 和 XPath 提取器都是实际的, - 或者通过设置“匹配号”强制 RegEx 提取器默认使用特定匹配。 (按照上面的例子到 2)。

  2. XPath Extractorxpath query 一起使用,这将唯一地描述所需的值:通过固定位置 - 如您的情况下的 //data[position()=2]/text()(假设第一个匹配始终为 0,您需要第二个), - 或按值 - 将匹配的 text() 与 0 进行比较,例如 //data[text()!=0]/text()

【讨论】:

    【解决方案3】:

    我对你的正则表达式中的? 感到困惑:(\d+?)。这意味着“一个或多个数字,但可选。”

    鉴于您从电话号码 1 和电话号码 2 输入的数据,我希望它在两种情况下都与第一行匹配,&lt;data xsi:type="soapenc:string"&gt;0&lt;/data&gt;,但您说它不匹配。

    我怀疑不想匹配带有前导零的数字。所以我建议

    Regular Expression: <data xsi:type="soapenc:string">([1-9]\d*)</data>
    

    【讨论】:

      【解决方案4】:

      给定网络服务调用

      对于网络服务调用号 1,它具有以下结构

      <data xsi:type="soapenc:string">0</data>
        <data xsi:type="soapenc:string">650</data>
      

      对于网络服务调用号 2,它具有以下结构

      <data xsi:type="soapenc:string">0</data>
        <data xsi:type="soapenc:string">10203</data>
      

      我们可以从 web 服务 call number1 中提取值 650,格式如下

      </data>\s\s<data xsi:type="soapenc:string">(.+)</data>
      or
      </data>\s\s<data xsi:type="soapenc:string">([0-9]+)</data>
      

      我们可以从 Web 服务调用号 2 中提取值 10203,格式如下

      </data>\s\s<data xsi:type="soapenc:string">(.+)</data>
      or
      </data>\s\s<data xsi:type="soapenc:string">([0-9]+)</data>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多