如何使用 groovy 脚本遍历 XML 标签
How to loop over XML tags using groovy script
我有一个 XML 响应,其中的命名空间如下:
<tns:Envelope xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/">
<tns:Body>
<svc:response xmlns:svc="http://...serviceNameSpace"
xmlns:ent="http://....entitiesNameSpace">
<svc:customerList>
<svc:customer>
<svc:nonIRDAssetInformationList>
<svc:nonIRDAssetInformation>
<ent:assetId>AssetId1</ent:assetId>
<ent:assetSerialNumber>SerialNum1</ent:assetSerialNumber>
<ent:assetType>AssetType1</ent:assetType>
</svc:nonIRDAssetInformation>
<svc:nonIRDAssetInformation>
<ent:assetId>AssetId2</ent:assetId>
<ent:assetSerialNumber>SerialNum2</ent:assetSerialNumber>
<ent:assetType>AssetType2</ent:assetType>
</svc:nonIRDAssetInformation>
</svc:nonIRDAssetInformationList>
</svc:customer>
</svc:customerList>
</svc:response >
</tns:Body>
</tns:Envelope>
此响应 XML 在 SoapUi 的响应 window 中。
我有一个 "assetSerialNumber" 的特定值,它将 return 在我不确定的 "nonIRDAssetInformation" 索引之一中。
现在我的要求是遍历所有 "nonIRDAssetInformation" 以检查哪个迭代具有特定值,我需要保存 "assetId" 标签的值。
我是 groovy 脚本的新手,经过一些研究后我写了下面的脚本。
import com.eviware.soapui.support.XmlHolder
//def holder = new XmlHolder(messageExchange.responseContentAsXml)
def Envelope = new XmlParser().parseText(messageExchange.responseContentAsXml)
def tns_ns = new groovy.xml.Namespace("http://..../envelope/", "tns")
def ent_ns = new groovy.xml.Namespace("http://..../entities/", "ent")
def svc_ns = new groovy.xml.Namespace("http://..../services", "svc")
def root = new XmlSlurper().parse(Envelope)
def serialNum= specific value is saved here
def nonIRDAssetInformationList = root.'**'.findAll{
it.name()=='nonIRDAssetInformation'
}
nonIRDAssetInformation.each{
it.assetSerialNumber.text().contains(serialNum)
messageExchange.modelItem.testStep.testCase.testSuite.setPropertyValue( "ClientAssetId",it.assetId.text() as String);
}
当我 运行 脚本时出现以下错误
No signature of method: groovy.util.XmlSlurper.parse() is applicable
for argument types: (groovy.util.Node) values:
[{http://schemas.xmlsoap.org/soap/envelope/}Envelope[attributes={};
value=[{http://schemas.xmlsoap.org/soap/envelope/}Header[attributes={};.....
有没有人可以帮我解决这个问题。
您似乎在尝试解析已解析的结果(不确定原因)
像这样的东西应该适合你:
import groovy.xml.*
def envelope = new XmlSlurper().parseText(messageExchange.responseContentAsXml)
def serialNum = 'Num'
envelope.'**'
.findAll { it.name() == 'nonIRDAssetInformation' }
.findAll { it.assetSerialNumber.text().contains(serialNum) }
.each {
println it.assetId.text()
}
我有一个 XML 响应,其中的命名空间如下:
<tns:Envelope xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/">
<tns:Body>
<svc:response xmlns:svc="http://...serviceNameSpace"
xmlns:ent="http://....entitiesNameSpace">
<svc:customerList>
<svc:customer>
<svc:nonIRDAssetInformationList>
<svc:nonIRDAssetInformation>
<ent:assetId>AssetId1</ent:assetId>
<ent:assetSerialNumber>SerialNum1</ent:assetSerialNumber>
<ent:assetType>AssetType1</ent:assetType>
</svc:nonIRDAssetInformation>
<svc:nonIRDAssetInformation>
<ent:assetId>AssetId2</ent:assetId>
<ent:assetSerialNumber>SerialNum2</ent:assetSerialNumber>
<ent:assetType>AssetType2</ent:assetType>
</svc:nonIRDAssetInformation>
</svc:nonIRDAssetInformationList>
</svc:customer>
</svc:customerList>
</svc:response >
</tns:Body>
</tns:Envelope>
此响应 XML 在 SoapUi 的响应 window 中。 我有一个 "assetSerialNumber" 的特定值,它将 return 在我不确定的 "nonIRDAssetInformation" 索引之一中。
现在我的要求是遍历所有 "nonIRDAssetInformation" 以检查哪个迭代具有特定值,我需要保存 "assetId" 标签的值。
我是 groovy 脚本的新手,经过一些研究后我写了下面的脚本。
import com.eviware.soapui.support.XmlHolder
//def holder = new XmlHolder(messageExchange.responseContentAsXml)
def Envelope = new XmlParser().parseText(messageExchange.responseContentAsXml)
def tns_ns = new groovy.xml.Namespace("http://..../envelope/", "tns")
def ent_ns = new groovy.xml.Namespace("http://..../entities/", "ent")
def svc_ns = new groovy.xml.Namespace("http://..../services", "svc")
def root = new XmlSlurper().parse(Envelope)
def serialNum= specific value is saved here
def nonIRDAssetInformationList = root.'**'.findAll{
it.name()=='nonIRDAssetInformation'
}
nonIRDAssetInformation.each{
it.assetSerialNumber.text().contains(serialNum)
messageExchange.modelItem.testStep.testCase.testSuite.setPropertyValue( "ClientAssetId",it.assetId.text() as String);
}
当我 运行 脚本时出现以下错误
No signature of method: groovy.util.XmlSlurper.parse() is applicable for argument types: (groovy.util.Node) values: [{http://schemas.xmlsoap.org/soap/envelope/}Envelope[attributes={}; value=[{http://schemas.xmlsoap.org/soap/envelope/}Header[attributes={};.....
有没有人可以帮我解决这个问题。
您似乎在尝试解析已解析的结果(不确定原因)
像这样的东西应该适合你:
import groovy.xml.*
def envelope = new XmlSlurper().parseText(messageExchange.responseContentAsXml)
def serialNum = 'Num'
envelope.'**'
.findAll { it.name() == 'nonIRDAssetInformation' }
.findAll { it.assetSerialNumber.text().contains(serialNum) }
.each {
println it.assetId.text()
}