0

我正在尝试使用一系列 AMF 请求为我的 API 在soapUI 中设置负载测试,但我无法弄清楚如何使用这样的 XML 响应进行属性传输:

<flex.messaging.io.amf.ASObject serialization="custom">
  <unserializable-parents/>
  <map>
    <default>
      <loadFactor>0.75</loadFactor>
      <threshold>48</threshold>
    </default>
    <int>64</int>
    <int>28</int>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <null/>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <object-array/>
    <string>key</string>
    <flex.messaging.io.amf.ASObject serialization="custom">
      <unserializable-parents/>
      <map>
        <default>
          <loadFactor>0.75</loadFactor>
          <threshold>12</threshold>
        </default>
        <int>16</int>
        <int>3</int>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
      </map>
      <flex.messaging.io.amf.ASObject>
        <default>
          <inHashCode>false</inHashCode>
          <inToString>false</inToString>
          <namedType>package/class</namedType>
        </default>
      </flex.messaging.io.amf.ASObject>
    </flex.messaging.io.amf.ASObject>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <boolean>value</boolean>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <flex.messaging.io.amf.ASObject serialization="custom">
      <unserializable-parents/>
      <map>
        <default>
          <loadFactor>0.75</loadFactor>
          <threshold>12</threshold>
        </default>
        <int>16</int>
        <int>5</int>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
        <string>key</string>
        <boolean>value</boolean>
      </map>
      <flex.messaging.io.amf.ASObject>
        <default>
          <inHashCode>false</inHashCode>
          <inToString>false</inToString>
          <namedType>package/class</namedType>
        </default>
      </flex.messaging.io.amf.ASObject>
    </flex.messaging.io.amf.ASObject>
    <string>guid</string>
    <string>818f40db-c217-46ed-a6a2-7c830d894a95</string>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <null/>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <string>value</string>
    <string>key</string>
    <null/>
    <string>key</string>
    <null/>
  </map>
  <flex.messaging.io.amf.ASObject>
    <default>
      <inHashCode>false</inHashCode>
      <inToString>false</inToString>
      <namedType>package/class</namedType>
    </default>
  </flex.messaging.io.amf.ASObject>
</flex.messaging.io.amf.ASObject>

因为我没有使用soapUI Pro,所以我无法访问xpath 向导。有没有办法通过属性传输或 Groovy 脚本来访问这个节点?

4

1 回答 1

0

您可以使用 XmlSlurper 访问这两个:

def src = '''<flex.messaging.io.amf.ASObject serialization="custom">
            |  <unserializable-parents/>
            |  <map>
            |    <default>
            |      <loadFactor>1.00</loadFactor>
            |      <threshold>50</threshold>
            |    </default>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <object-array/>
            |    <string>Not what I need</string>
            |    <string>This is the KEY I'm looking for</string>
            |    <string>This is the VALUE I need to pass to the next test step</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <null/>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <string>Not what I need</string>
            |    <null/>
            |    <string>Not what I need</string>
            |    <null/>
            |  </map>
            |</flex.messaging.io.amf.ASObject>'''.stripMargin()

def aso = new XmlSlurper().parseText( src )

def (key,value) = aso.map.string[6..7]*.text()

println "  key = $key"
println "value = $value"

这感觉有点“硬编码”,但我看不出如何以编程方式定位这些值:-(


编辑

鉴于您发布的新 XML,这似乎适用于这种情况:

println aso.map.children()[ 3..-1 ]    // Strip out the initial default and ints
       .collate( 2 )                   // Group the key/value pairs
       .findAll { 
         it[ 0 ].text() == 'guid'      // find all that have 'guid' as element 0
       }
       .collectEntries { it*.text() }  // convert this into a map

并打印:

[guid:818f40db-c217-46ed-a6a2-7c830d894a95]

但是,更彻底的 depthFirst 算法可能是扫描所有可能输入的更可靠的方法(我不知道 ASObject 序列化,所以我不知道这是否适用于这个实例)


编辑 2

当你被一个没有方法的 Groovy 版本(1.8.6)困住时,你可以使用传统的循环collate来做这样的事情:for

def aso = new XmlSlurper().parseText( src ).map.children()
String guid = null
for( i = 3 ; i < aso.size() ; i += 2 ) {
  if( aso[ i ] == 'guid' ) {
    guid = aso[ i + 1 ]
    break
  }
}
println guid
于 2012-05-22T07:42:53.410 回答