1

我在 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>

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

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

4

4 回答 4

5

上面的示例代码对我有用,但是缺少一个导入:

import org.xml.sax.InputSource;

作为行:

InputSource is = new InputSource(new StringReader(result.getResponseDataAsString()));

需要导入 InputSource。

之后它对我来说非常有用。

于 2014-01-18T22:20:57.583 回答
4

尝试使用Beanshell PostProcessor和 beanshell/java 代码从 xml-response 中提取所有值并将它们存储在变量中或写入文件。

  1. 将 Beanshell PostProcessor 作为子级附加到从上面返回您的 xml 响应的采样器。
  2. 在 PostProcessor 中使用以下代码(从外部文件或插入“脚本”字段)提取并保存密钥:
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

import org.apache.jmeter.samplers.SampleResult;

// set here your xpath expression (to extract EVERY key, not any separate one)
String xpathExpr = "//serviceResponse/details/key/text()";

try {
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();

    // access result of parent sampler via "ctx" BeanShell variable        
    SampleResult result = ctx.getPreviousResult();
    InputSource is = new InputSource(new StringReader(result.getResponseDataAsString()));
    Document doc = builder.parse(is);

    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile(xpathExpr);
    NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);

    // extract all the keys in loop
    for (int i = 0; i < nodes.getLength(); i++) {
        String key = nodes.item(i).getNodeValue();

        System.out.println(key);

        // save extracted key as separate jmeter variables        
        String keyName = "key_" + Integer.toString(i);
        vars.put(keyName,key);
    }
} catch (Exception ex) {
    IsSuccess = false;
    log.error(ex.getMessage());
    ex.printStackTrace();
}

您还可以将所有提取的密钥保存到文件中,然后通过CSV Data Set Config读取。

您也可以通过示例查看有关 Java XPath API 的好文章,以防您在脚本实现中遇到任何困难。

希望这可以帮助。

于 2012-04-10T16:40:53.613 回答
0

获取数据后,添加一个 BeanShell PostProcessor 元素。使用下面的代码将变量写入文件:

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();
于 2013-03-01T14:10:37.733 回答
0

选择的答案似乎是一种复杂的方法,只需使用以下方法进行 xpath 提取:

//serviceResponse/details/key/text()

几乎与您自己的 xpath 相同,除了它查找所有元素,而不仅仅是第一个元素(通过简单地删除数组引用 [])。

这会将所有找到的键放入名为 key_? 的变量中。在哪里 ?是从 key_1 递增的整数。

您可以找到从变量 key_matchNr 中提取了多少变量。

上面的复杂版本不同之处在于它将从 key_0 开始。

现在如何迭代这个列表是另一回事,如果这是你需要做的。

于 2014-10-08T00:40:13.473 回答