我有以下 CSV 文件:
iDocType,iDocId,iName,iDate
P,555551555,Braiden,2022-12-31
I,100000001,Dominique,2024-12-10
P,100000002,Joyce,2025-11-15
使用 jmeter 的 JSR223 预处理器元素,我需要组成一个包含多个(基于参数化)子节点的 XML 父节点,并且每个节点必须包含具有这些 CSV 行中的每一个的值的属性。
我认为我需要一些方法来循环这个 CSV 文件并从每一行中提取值,直到我的所有目标对象都组合完毕。也许该方法应该有一个createMasterXml
使用 2 个参数调用的方法,例如findTargetIdInCsv
andtargetNumberOfXmlNodes
和一个 for 循环,其中解析 csv 文件并使用 groovy.xml.MarkupBuilder 在其中组成子节点。但我不知道如何解决这个问题。
目标逻辑:
- 根据 ID 变量查找 csv 行
- 使用该 ID 找到的第一个行中的值组成第一个对象
- 向下查找下一个 csv 行
- 用第二行的值组成第二个对象.....
- 这样做直到创建了目标数量的对象
- 如果到达文件末尾,则从文件的顶行开始(不带标题)
例如,给定上述 csv 文件:
I get a variable docId populated with the value 100000001 which is found on the 2nd row of data in the csv file (ignoring the header);
I define a variable numberOfNodes = 3;
然后我期望这个映射创建一个对象:
child node 1 - ValuesFromCsvRow2
child node 2 - ValuesFromCsvRow3
child node 3 - ValuesFromCsvRow1
更新:JSR223 PreProcessor 代码:(注意,使用这种当前方法,我无法根据上述预期逻辑组合子节点对象,因为当前方法无法处理解析 CSV 文件和提取值 - 我错过了这样做的知识)
//input from csv file
docType = vars.get('iDocType').toString()
docId = vars.get('iDocId').toString()
name = vars.get('iName').toString()
date = vars.get('iExpiryDate').toString()
def numberOfNodes = 3
def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
xml.nodes() {
createNode(xml, numberOfNodes, 'ID0000')
}
def createNode(builder, repeat, pReqID) {
for (int i = 0 ; i < repeat ; i++) {
builder.object(a:'false', b:'false', pReqID:pReqID +(i+1).toString()) {
builder.al(ad:'2021-09-20', alc:'bla', bla:'2021-09-20T11:00:00.000Z', sn:'AB8912')
builder.doc( docType: docType, docId: docId, name: name , date:date )
}
}
}
def nodeAsText = writer.toString()
//log.info(nodeAsText)
vars.put('passengers3XmlObj', nodeAsText)
代码行中的值builder.doc
是我需要在每个节点创建时根据源 csv 文件中每一行的值更改的值。
目前,在这种情况下,我的主对象看起来像这样,因为在每次 jmeter 迭代中,我只知道如何从 csv 文件中的一行中获取值,每个采样器(使用 CSV 数据集测试计划元素):
<objects>
<object a='false' b='false' pReqID='ID00001'>
<al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
</object>
<object a='false' b='false' pReqID='ID00002'>
<al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
</object>
<object a='false' b='false' pReqID='ID00003'>
<al ad='2021-09-20' alc='bla' bla='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='P' docId='100000001' date='2024-12-10' name='Dominique' />
</object>
</objects>
但是,我需要它看起来像这样,保持目标逻辑的中间:
<objects>
<object a='false' b='false' c='ID00001'>
<al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='I' docId='100000001' date='2024-12-10' name='Dominique' />
</object>
<object a='false' b='false' c='ID00002'>
<al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='P' docId='100000002' date='2025-11-15' name='Joyce' />
</object>
<object a='false' b='false' c='ID00003'>
<al ad='2021-09-20' alc='bla' dt='2021-09-20T11:00:00.000Z' sn='AB8912' />
<doc docType='P' docId='555551555' date='2022-12-31' name='Braiden' />
</object>
</objects>
有人可以帮我实现这一目标吗?