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 を使用して、これら 2 つにアクセスできます。

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 のバージョンcollate(1.8.6) に行き詰まっているので、従来の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 に答える