Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 循环通过JMeter中的数据并存储数据以用于其他采样器_Xml_Xpath_Jmeter - Fatal编程技术网

Xml 循环通过JMeter中的数据并存储数据以用于其他采样器

Xml 循环通过JMeter中的数据并存储数据以用于其他采样器,xml,xpath,jmeter,Xml,Xpath,Jmeter,我在JMeter中的XML响应中有以下数据: <details> <srNo>1</srNo> <key>123</key> <Name>Inspector</piName> <age>89</age> <country>India</country> </details> .................................... ...

我在JMeter中的XML响应中有以下数据:

<details>
<srNo>1</srNo>
<key>123</key>
<Name>Inspector</piName>
<age>89</age>
<country>India</country>
</details>
....................................
...................................
<details>
<srNo>1</srNo>
<key>123</key>
<Name>Inspector</piName>
<age>89</age>
<country>America</country>
</details>

1.
123
检查员
89
印度
....................................
...................................
1.
123
检查员
89
美国
假设我有n个这样的数据,来自XML文件的响应。我想读“键”的值。对于例1,我必须读取“1”并存储在变量中。 对于1个这样的响应,我在XPath提取器中读取它并获得正确的值,但现在我必须循环遍历它以获得变量中指定数量的键值。假设我想要1000个这样的键,那么我必须循环1000次才能得到变量中的所有值

在变量中获得该值后,我必须在另一个采样器中使用该值 例如:${key1}

尝试使用beanshell/java代码从xml响应中提取所有值,并将它们存储在变量中或写入文件中

  • 将Beanshell后处理器作为子级附加到从上面返回xml响应的采样器
  • 在后处理器中使用以下代码(从外部文件或插入“脚本”字段)提取和保存密钥:
  • import java.io.*;
    导入javax.xml.parsers.*;
    导入javax.xml.xpath.*;
    导入org.w3c.dom.*;
    导入org.xml.sax.SAXException;
    导入org.apache.jmeter.samplers.SampleResult;
    //在这里设置xpath表达式(提取每个键,而不是任何单独的键)
    字符串xpathExpr=“//servicesponse/details/key/text()”;
    试一试{
    DocumentBuilderFactory domFactory=DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder=domFactory.newDocumentBuilder();
    //通过“ctx”BeanShell变量访问父采样器的结果
    SampleResult结果=ctx.getPreviousResult();
    InputSource is=新的InputSource(新的StringReader(result.getResponseDataAsString());
    文档doc=builder.parse(is);
    XPath=XPathFactory.newInstance().newXPath();
    XPathExpression expr=xpath.compile(xpathExpr);
    NodeList节点=(NodeList)expr.evaluate(doc,XPathConstants.NODESET);
    //提取循环中的所有键
    对于(int i=0;i
    您还可以将所有提取的密钥保存到文件中,然后通过读取

    此外,如果您在脚本实现中遇到任何困难,您也可以通过示例进行研究


    希望这有帮助。

    获取数据后,添加BeanShell后处理器元素。使用以下代码将变量写入文件:

    name = vars.get("name");
    email = vars.get("email");
    
    log.info(email);  // if you want to log something to jmeter.log file
    
    // Pass true if you want to append to existing file
    // If you want to overwrite, then don't pass the second argument
    f = new FileOutputStream("/my/file/path/result.csv", true);
    p = new PrintStream(f); 
    this.interpreter.setOut(p); 
    print(name + "," + email);
    f.close();
    

    上述示例代码适用于我,但缺少一个导入:

    import org.xml.sax.InputSource;
    
    作为一行:

    InputSource is = new InputSource(new StringReader(result.getResponseDataAsString()));
    
    需要导入InputSource


    在这之后,它对我非常有效。

    选择的答案似乎是一种复杂的xpath提取方法,使用:

    //serviceResponse/details/key/text()

    与您自己的xpath几乎相同,只是它查找所有元素,而不仅仅是第一个元素(只需删除数组引用[])

    这将把所有找到的键放入名为key\ux的变量中?哪里是从键_1开始递增的整数

    您可以找到从变量键\u matchNr中提取了多少个变量

    上述复杂版本的不同之处在于,它将从0键开始


    现在,如果您需要这样做,那么如何迭代这个列表是另一回事。

    您不必循环。发布您的XPath,这样我们就可以看到您目前正在做什么。@jdwilemo,感谢您的回复,我使用了以下XPath查询来获取第一个键:/serviceress/details[1]/key/text(),我必须将所有键值转换为变量,并在其他采样器中使用它们。@BlackGaff请查看我的案例。谢谢。谢谢你的注意,似乎是我的错。添加了必需的导入(尽管对于beanshell脚本,jmeter通常不需要像java.io.*这样的导入)。