【问题标题】:Parse Same level Node in SOAP UI and Groovy在 SOAP UI 和 Groovy 中解析相同级别的节点
【发布时间】:2016-09-26 13:24:54
【问题描述】:

我有以下 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 中作为常规步骤的代码

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 : [  ]

【问题讨论】:

  • 这两个元素都是重复的,而不是简单的值。每个元素的预期值是多少?
  • accumulatorID = 1 accumulatorValue = 0 accumulatorID = 2 accumulatorValue = 0
  • 感谢您提供详细信息。您能否提供可解析的 xml,同时它具有原始 xml 所需的所有详细信息?

标签: xpath groovy xml-parsing soapui


【解决方案1】:

以下 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 链接快速尝试该脚本。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多