2012-04-05 4 views
0

Ich habe Daten in XML-Antwort in JMeter folgenden:Looping durch die Daten in JMeter und Speichern von Daten in anderen Abtaster verwenden

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

nehme ich n Anzahl solcher Daten haben, aus der Reaktion der XML-Datei. Ich möchte den Wert von "Schlüssel" lesen. für z. 1 Ich muss "1" lesen und in einer Variablen speichern. Für 1 solche Antwort lese ich es in XPath-Extraktor und bekomme den richtigen Wert, aber jetzt muss ich es durchlaufen, um die angegebene Menge an Schlüsselwert in einer Variablen zu erhalten. Angenommen, ich möchte 1000 solcher Schlüssel, dann muss ich bis zu 1000 Mal durchlaufen, um alle Werte in Variablen zu erhalten.

Nach diesem Wert in Variablen immer ich habe diesen Wert in einem anderen Sampler für zB verwendet: $ {key1}

+0

sollten Sie nicht Schleife müssen. Sende deinen XPath, damit wir sehen können, was du bisher gemacht hast. – JWiley

+0

@jdwilemo, danke für die Antwort, habe ich folgende XPath-Abfrage verwendet, um den ersten Schlüssel zu erhalten: /serviceResponse/details [1]/key/text() Ich muss alle Schlüsselwerte in Variablen und verwendet sie in anderen Sampler. – Shaggy

+0

@BlackGaff Bitte in meinem Fall nachsehen. Danke. – Shaggy

Antwort

4

Try Beanshell PostProcessor mit Beanshell/Java-Code zu verwenden, um alle Werte aus XML-Antwort zu extrahieren und Speichern Sie sie in Variablen oder schreiben Sie in Datei.

  1. Hängen Sie Beanshell PostProcessor als untergeordnetes Element an den Sampler an, der Ihre XML-Antwort von oben zurückgibt.
  2. Verwenden Sie den folgenden Code in Postprocessor (aus externer Datei oder legen Sie in „Script“ Feld) die Schlüssel zu extrahieren und speichern:
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(); 
} 

Sie auch alle extrahierten Schlüssel in der Datei speichern und dann lesen über CSV Data Set Config.

Sie können auch in good article about Java XPath API mit Beispielen suchen, falls Sie irgendwelche Schwierigkeiten bei der Skript-Implementierung begegnen.

Hoffe, das hilft.

+1

Fehlt dem Code einige Importanweisungen? – blank

+0

Vielen Dank für das Bemerken, scheint meine Schuld zu sein. Die erforderlichen Importe wurden hinzugefügt (obwohl jmeter normalerweise keine Importe wie java.io. * für Beanshell-Skripte benötigt). –

0

Fügen Sie nach dem Abrufen der Daten ein BeanShell PostProcessor-Element hinzu. Verwenden Sie die folgende Code die Variablen in eine Datei zu schreiben:

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(); 
4

Das obige Beispiel-Code funktioniert bei mir jedoch fehlt ein Import:

import org.xml.sax.InputSource; 

Als die Zeile:

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

erfordert, dass InputSource importiert wird.

Danach funktioniert es perfekt für mich.

0

Die gewählte Antwort scheint eine komplizierte Art und Weise von nur tun, eine XPath-Extraktion zu verwenden:

// serviceResponse/details/key/text()

fast die gleiche wie Ihre eigenen XPath, außer es findet alle Elemente, nicht nur die ersten (durch einfaches Entfernen der Array-Referenz []).

Dies wird alle gefundenen Schlüssel in Variablen namens key_? woher ? ist eine inkrementierende Ganzzahl aus Schlüssel_1.

Sie können herausfinden, wie viele Variablen aus der Variablen key_matchNr extrahiert wurden.

Die obige komplizierte Version unterscheidet sich dadurch, dass sie bei key_0 beginnt.

Jetzt, wie man über diese Liste iterieren ist eine andere Sache, wenn das ist, was Sie tun müssen.

Verwandte Themen