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

您的示例中存在一些问题。

  1. XML 无效:所有 <ns8:offerDetails> 元素都缺少结束标记。
  2. 您的 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]

第三个报价不包含任何区域。