解析 SOAP UI 和 Groovy 中的同级节点
Parse Same level Node in SOAP UI and Groovy
我有以下 XML 并且想要解析以获取值
<member>
<name>accumulatorInformation</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value>
<dateTime.iso8601>20161004T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorID</name>
<value>
<i4>1</i4>
</value>
</member>
<member>
<name>accumulatorStartDate</name>
<value>
<dateTime.iso8601>20160904T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorValue</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
<value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value>
<dateTime.iso8601>20161017T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorID</name>
<value>
<i4>2</i4>
</value>
</member>
<member>
<name>accumulatorStartDate</name>
<value>
<dateTime.iso8601>20160917T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorValue</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
我尝试解析但只需要 accumulatorID 和 accumulatorValue。
以下是我在 SOAPUI 中的代码作为 groovy 步骤
def responseHolder = groovyUtils.getXmlHolder("Get#Response")
for( struct in responseHolder.getNodeValues( "//member[name='accumulatorInformation']/value/array/data/value/struct/*" ))
log.info "struct : [$struct]"
log.info "accumulatorID : " + struct.getNodeValues( "//member[name='accumulatorID']/value/descendant::*" )
它显示如下输出,第二行显示错误
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
你的 xml 格式不正确但是这个
import groovy.xml.XmlUtil
content = """ <value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value><dateTime.iso8601>20161004T12:00:00+0000</dateTime.iso8601></value>
</member>
<member>
<name>accumulatorID</name>
<value><i4>1</i4></value>
</member>
<member>
<name>accumulatorStartDate</name>
<value><dateTime.iso8601>20160904T12:00:00+0000</dateTime.iso8601></value>
</member>
<member>
<name>accumulatorValue</name>
<value><i4>0</i4></value>
</member>
</struct>
</value>
"""
def p = new XmlSlurper().parseText(content)
// def v= p.value.struct.member[0].name.text()
assert "accumulatorEndDate"==p.struct.member[0].name.text().toString()
println (p.struct.member[1].value.i4.text())
println (p.struct.member[3].value.i4.text())
将打印所需的值
1
0
你也可以
p.struct.member.each{
println "${it.name.text()} "
println "${it.value.text()} "
}
打印这些
accumulatorEndDate
20161004T12:00:00+0000
accumulatorID
1
accumulatorStartDate
20160904T12:00:00+0000
accumulatorValue
0
以下 groovy 脚本提取列表中的 ID 和单独列表中的值。
//Pass your xml string
def parsedXml = new XmlSlurper().parseText(xml)
//closure to search for the given element in the xml
def searchData = { data, element -> data.'**'.findAll { it.name() == 'name' && it == element }*.parent().value.i4 }
//Using the above closure to search `accumulatorID` and `accumulatorValue` respectively
def accumulatorIds = searchData(parsedXml, 'accumulatorID')
def accumulatorValues = searchData(parsedXml, 'accumulatorValue')
println accumulatorIds
println accumulatorValues
可以使用 this link 快速试用该脚本。
希望这有帮助。
我有以下 XML 并且想要解析以获取值
<member>
<name>accumulatorInformation</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value>
<dateTime.iso8601>20161004T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorID</name>
<value>
<i4>1</i4>
</value>
</member>
<member>
<name>accumulatorStartDate</name>
<value>
<dateTime.iso8601>20160904T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorValue</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
<value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value>
<dateTime.iso8601>20161017T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorID</name>
<value>
<i4>2</i4>
</value>
</member>
<member>
<name>accumulatorStartDate</name>
<value>
<dateTime.iso8601>20160917T12:00:00+0000</dateTime.iso8601>
</value>
</member>
<member>
<name>accumulatorValue</name>
<value>
<i4>0</i4>
</value>
</member>
</struct>
</value>
</data>
</array>
</value>
</member>
我尝试解析但只需要 accumulatorID 和 accumulatorValue。
以下是我在 SOAPUI 中的代码作为 groovy 步骤
def responseHolder = groovyUtils.getXmlHolder("Get#Response")
for( struct in responseHolder.getNodeValues( "//member[name='accumulatorInformation']/value/array/data/value/struct/*" ))
log.info "struct : [$struct]"
log.info "accumulatorID : " + struct.getNodeValues( "//member[name='accumulatorID']/value/descendant::*" )
它显示如下输出,第二行显示错误
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
Mon Sep 26 16:54:01 GST 2016:INFO:struct : [ ]
你的 xml 格式不正确但是这个
import groovy.xml.XmlUtil
content = """ <value>
<struct>
<member>
<name>accumulatorEndDate</name>
<value><dateTime.iso8601>20161004T12:00:00+0000</dateTime.iso8601></value>
</member>
<member>
<name>accumulatorID</name>
<value><i4>1</i4></value>
</member>
<member>
<name>accumulatorStartDate</name>
<value><dateTime.iso8601>20160904T12:00:00+0000</dateTime.iso8601></value>
</member>
<member>
<name>accumulatorValue</name>
<value><i4>0</i4></value>
</member>
</struct>
</value>
"""
def p = new XmlSlurper().parseText(content)
// def v= p.value.struct.member[0].name.text()
assert "accumulatorEndDate"==p.struct.member[0].name.text().toString()
println (p.struct.member[1].value.i4.text())
println (p.struct.member[3].value.i4.text())
将打印所需的值
1
0
你也可以
p.struct.member.each{
println "${it.name.text()} "
println "${it.value.text()} "
}
打印这些
accumulatorEndDate
20161004T12:00:00+0000
accumulatorID
1
accumulatorStartDate
20160904T12:00:00+0000
accumulatorValue
0
以下 groovy 脚本提取列表中的 ID 和单独列表中的值。
//Pass your xml string
def parsedXml = new XmlSlurper().parseText(xml)
//closure to search for the given element in the xml
def searchData = { data, element -> data.'**'.findAll { it.name() == 'name' && it == element }*.parent().value.i4 }
//Using the above closure to search `accumulatorID` and `accumulatorValue` respectively
def accumulatorIds = searchData(parsedXml, 'accumulatorID')
def accumulatorValues = searchData(parsedXml, 'accumulatorValue')
println accumulatorIds
println accumulatorValues
可以使用 this link 快速试用该脚本。 希望这有帮助。