使用 groovy 在 xml 中获取具有相同节点名称的嵌套 xml 的值
Getting the value of nested xml with same node names in xml using groovy
我是 Groovy 的新手,我正在尝试使用 Groovy 打印以下输出,但我无法从 XML.[=16 下面获取区域值=]
我尝试使用 .each 并将报价代码保存到列表中并打印值,但我无法对 Zone 执行相同的操作。你能指导我吗?
这里是XML:
<ns8:Offers>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>6789</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
<ns8:offerZones>
<ns8:zone>Zone 1</ns8:zone>
<ns8:zone>Zone 2</ns8:zone>
<ns8:zone>Zone 3</ns8:zone>
<ns8:zone>Zone 4</ns8:zone>
</ns8:offerZones>
</ns8:Offer>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>12345</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
<ns8:offerZones>
<ns8:zone>Zone 1</ns8:zone>
<ns8:zone>Zone 2</ns8:zone>
<ns8:zone>Zone 3</ns8:zone>
<ns8:zone>Zone 4</ns8:zone>
</ns8:offerZones>
</ns8:Offer>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>12345</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
</ns8:Offer>
</ns8:Offers>
预期输出:Offer code is :6789 and Offer Zone are:Zone 1,Zone 2,Zone 3,Zone 4
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.xssf.usermodel.*
import org.apache.poi.ss.util.*
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.text.SimpleDateFormat
import com.eviware.soapui.support.XmlHolder
def QuerySubscriberResponse = context.expand( '${QuerySubscriber#Response}' )
def queryxml = new XmlSlurper().parseText(QuerySubscriberResponse)
def nbaofferscode=[];
def nbaOffersZone=[];
queryxml.Body.querySubscriberResponse.profferOffers.profferOffer.each{ nbaofferss ->
nbaofferscode.add(nbaofferss.offerDetails.offerCode)
}
log.info nbaofferscode
您的示例中存在一些问题。
- XML 无效:所有
<ns8:offerDetails>
元素都缺少结束标记。
- 您的 GPath 与 XML 不匹配。
您的 GPath 似乎希望 XML 嵌入到网页中。
在此示例中,我添加了缺少的 </ns8:offerDetails>
结束标记并从文件中加载了 XML。
file = new File( 'NestedXml.xml')
def queryxml = new XmlParser(false,false)
.parse( file )
def nbaofferscode=[];
def nbaOffersZone=[];
queryxml.each { offer ->
offer.'ns8:offerZones'.'ns8:zone'.each { zone ->
nbaOffersZone << zone.text()
}
nbaofferscode << offer.'ns8:offerDetails'.offerCode.text()
}
println nbaofferscode
println nbaOffersZone
运行 上面的脚本给出了这个输出:
[6789, 12345, 12345]
[Zone 1, Zone 2, Zone 3, Zone 4, Zone 1, Zone 2, Zone 3, Zone 4]
第三个报价不包含任何区域。
我是 Groovy 的新手,我正在尝试使用 Groovy 打印以下输出,但我无法从 XML.[=16 下面获取区域值=]
我尝试使用 .each 并将报价代码保存到列表中并打印值,但我无法对 Zone 执行相同的操作。你能指导我吗?
这里是XML:
<ns8:Offers>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>6789</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
<ns8:offerZones>
<ns8:zone>Zone 1</ns8:zone>
<ns8:zone>Zone 2</ns8:zone>
<ns8:zone>Zone 3</ns8:zone>
<ns8:zone>Zone 4</ns8:zone>
</ns8:offerZones>
</ns8:Offer>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>12345</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
<ns8:offerZones>
<ns8:zone>Zone 1</ns8:zone>
<ns8:zone>Zone 2</ns8:zone>
<ns8:zone>Zone 3</ns8:zone>
<ns8:zone>Zone 4</ns8:zone>
</ns8:offerZones>
</ns8:Offer>
<ns8:Offer>
<ns8:offerDetails>
<offerCode>12345</offerCode>
<offerCategory>ABCED</offerCategory>
<offerType>
<Value>Promo</Value>
<Language>E</Language>
</ns8:offerDetails>
</ns8:Offer>
</ns8:Offers>
预期输出:Offer code is :6789 and Offer Zone are:Zone 1,Zone 2,Zone 3,Zone 4
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
import org.apache.poi.ss.usermodel.*
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.xssf.usermodel.*
import org.apache.poi.ss.util.*
import org.apache.poi.xssf.usermodel.XSSFWorkbook
import java.text.SimpleDateFormat
import com.eviware.soapui.support.XmlHolder
def QuerySubscriberResponse = context.expand( '${QuerySubscriber#Response}' )
def queryxml = new XmlSlurper().parseText(QuerySubscriberResponse)
def nbaofferscode=[];
def nbaOffersZone=[];
queryxml.Body.querySubscriberResponse.profferOffers.profferOffer.each{ nbaofferss ->
nbaofferscode.add(nbaofferss.offerDetails.offerCode)
}
log.info nbaofferscode
您的示例中存在一些问题。
- XML 无效:所有
<ns8:offerDetails>
元素都缺少结束标记。 - 您的 GPath 与 XML 不匹配。
您的 GPath 似乎希望 XML 嵌入到网页中。
在此示例中,我添加了缺少的 </ns8:offerDetails>
结束标记并从文件中加载了 XML。
file = new File( 'NestedXml.xml')
def queryxml = new XmlParser(false,false)
.parse( file )
def nbaofferscode=[];
def nbaOffersZone=[];
queryxml.each { offer ->
offer.'ns8:offerZones'.'ns8:zone'.each { zone ->
nbaOffersZone << zone.text()
}
nbaofferscode << offer.'ns8:offerDetails'.offerCode.text()
}
println nbaofferscode
println nbaOffersZone
运行 上面的脚本给出了这个输出:
[6789, 12345, 12345]
[Zone 1, Zone 2, Zone 3, Zone 4, Zone 1, Zone 2, Zone 3, Zone 4]
第三个报价不包含任何区域。