如何遍历已提取路径的LOB文件提取指定值并用于XML payload?
实现步骤(基于JMeter)
1. 确认已提取的文件路径变量
假设你通过正则提取器已得到变量file_path_1、file_path_2……file_path_20,且提取器的Match No.设为-1(提取所有匹配项),JMeter会自动生成file_path_matchNr变量,记录匹配到的文件总数。
2. 添加循环控制器遍历文件
- 添加循环控制器,将循环次数设置为
${file_path_matchNr},确保遍历所有提取到的文件路径。 - 在循环控制器内添加JSR223 Sampler(选择Groovy语言),用于读取文件、解析XML并提取目标值。
3. JSR223 Sampler 代码实现
在JSR223 Sampler中写入以下Groovy代码,替换目标标签ID为你需要提取的XML标签名:
// 获取当前循环索引(从1开始) def index = vars.getIteration() def filePath = vars.get("file_path_" + index) // 读取LOB文件的XML内容 def file = new File(filePath) def xmlContent = file.text // 解析XML并提取目标标签值 def xmlSlurper = new XmlSlurper() def root = xmlSlurper.parseText(xmlContent) def targetValue = root.'**'.find { it.name() == '目标标签ID' }.text() // 按顺序存储提取值,如extracted_value_1、extracted_value_2... vars.put("extracted_value_" + index, targetValue) // 若需拼接成XML片段用于第二个请求payload def allValues = vars.get("all_extracted_values") ?: "" allValues += "<value>${targetValue}</value>" vars.put("all_extracted_values", allValues)
4. 在第二个请求中引用提取的值
- 若需逐个引用,直接使用
${extracted_value_1}、${extracted_value_2}等变量; - 若需连续XML节点,直接引用拼接好的
${all_extracted_values}。
示例第二个请求的XML payload:
<data> <extracted-values> ${all_extracted_values} </extracted-values> </data>
注意事项
- 确保JMeter运行用户拥有LOB文件的读取权限,否则会触发文件访问异常;
- 若XML含命名空间,需添加命名空间处理逻辑,示例:
xmlSlurper.setFeature("http://xml.org/sax/features/namespaces", true) def ns = new groovy.xml.Namespace("http://你的命名空间URI", "ns") def targetValue = root.ns.'目标标签ID'.text() - 若文件编码非UTF-8,读取时需指定编码,如
file.getText("GBK")。
内容的提问来源于stack exchange,提问作者NPAL
相关产品推荐
相关产品推荐

