2014-10-08 59 views
1

考虑下面的文字,可能是从JMeter的HTTP响应的一部分:让表达式匹配可选值,如果可能的话

<menu id="Alpha" name="alpha"> 
    <option value="a">A</option> 
    <option value="b">B</option> 
    <option value="c" selected="selected">C</option> 
</menu> 

<menu id="Bravo" name="bravo"> 
    <option value="d">D</option> 
    <option value="e">E</option> 
</menu> 

我试图提取每个菜单的ID,以及所选择的选项的值,如果有选项选择。如果没有选择选项,则默认情况下,第一个选项的值应该匹配。例如,在这个例子中,我想下面要匹配:

"Alpha" "c" 
"Bravo" "d" 

到目前为止,我写了下面的:

<select id="Form:parameterList:([^"]+?)".*?>.*?(?:<option value="([^"]*?)".*?(?:selected="selected")?>)?.*?</select> 

这样做的问题是,只有第一个选项的值永远匹配,并且选定的选项永远不会匹配。也就是说,我想优先匹配可选模式。

感谢, 维克多

回答

1

考虑怎样维护你的脚本将使用复杂的正则表达式。

你可以实现你的愿望使用XPath提取,有条件/回路控制器和或后置处理的结果...

首先获得所有ID的列表:

//menu/@id 

你可以得到一个包含与选择的属性的选项id列表=“选择”与类似于:

//menu/@id[/option[@selected='selected']] 

迭代通过第一列表(在BeanShell的处理器或回路控制器, 例如)。如果一个ID出现在第二个列表中,提取出与所选择的值:

//menu[@id='xxxx']/option[@selected='selected']/@value /*substitue xxxx with appropriate id*/ 

其中ID没有一个“选择”的值,提取默认值:

//menu/[@id='xxxx']/option[1]/@value /*substitue xxxx with appropriate id*/ 

(抱歉,如果我的xpath并不是完全准确的,我已经从内存中单独写了这个,但希望面包屑可以遵循)

+1

作为一个说明,第二个应该是 '// menu [option/@ selected =“selected “]/@ id' 否则,谢谢! – Victor 2014-10-09 16:19:54