解析 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 快速试用该脚本。 希望这有帮助。