XMLノードパスをパラメーターとしてgroovyのメソッドに転送するにはどうすればよいですか?

ユーザー

XMLノード値を検証するために次のコードを記述しました。以下のコードは、単一ノードをトラバースして値を出力する必要がある場合に正常に機能します。しかし、子ノードにトラバースしてノード値を返そうとすると、正しい値を取得できません。

//Sample XML (sample_2015-10-12.xml)
<a>
   <b>
      <c1 Action="C">
         <Id>12345</Id>
         <DisplayName>User1</DisplayName>
         <Price>68.0000</Price>
         <d>
            <mv>
               <value>29</value>
            </mv>
         </d>
      </c1>
      <c2 Action="C">
         <Id>12378</Id>
         <DisplayName>User2</DisplayName>
         <Price>70.0000</Price>
         <d>
            <mv>
               <value>30</value>
            </mv>
         </d>
      </c2>   
   </b>
</a>


//Call class example and pass the node path as a parameter
library = testRunner.testCase.testSuite.project.testSuites["XMLValidate"]
module = library.testCases["XMLValidate"].testSteps["validateXML"]
module.run(testRunner, context)
def example = context.example
log.info "example.execute() = " + example.execute("d.mv.value");    


//Traverse the XML node and print the node value
class Example
{
   def log
   def context
   def testRunner
   def xPath

   // Class constructor with same case as Class name
   def Example(logIn,contextIn,testRunnerIn)
   {
      this.log = logIn
      this.context = contextIn
      this.testRunner = testRunnerIn
      this.xPath = xPath
   }
    def execute(xPath)
   {
        log.info xPath
        def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
        def XMLPath = context.expand("F:\\Sample_2015-10-12.xml");
        def samplexml = new File(XMLPath).text;
        def root = new XmlParser().parseText( samplexml )
        def strPath = XMLPath.split(Pattern.quote('\\'))
        def strFileName = strPath[strPath.size()-1].split('_');


    int cnt = 0
    switch( strFileName[0] ){
        case "Sample":
            def Var = root.b.c
            log.info Var
            Var.any{
                String intNum = it.Id.collect {it.text()}
                log.info it.Id.collect {it.text()}
                if (intNum.replace('[','').replace(']','') == "12378"){
                    log.info cnt
                    true
                }
                else{
                    cnt = cnt + 1
                    return
                }           
            }

            def Var2 = root.b.c[cnt]."${xPath}"
            log.info Var2.collect {it.text()}
    }


  }
}
context.setProperty( "example", new Example( log, context, testRunner) )

親切に助けて

エマニュエルローザ

できることは、パスを各部分(dmvvalueなど)にNode.getAt(String)分解してから、呼び出して階層をトラバースすることです。これが例です。

import groovy.util.XmlParser
import groovy.util.Node

def data = '''
<a>
   <b>
      <c1 Action="C">
         <Id>12345</Id>
         <DisplayName>User1</DisplayName>
         <Price>68.0000</Price>
         <d>
            <mv>
               <value>29</value>
            </mv>
         </d>
      </c1>
      <c2 Action="C">
         <Id>12378</Id>
         <DisplayName>User2</DisplayName>
         <Price>70.0000</Price>
         <d>
            <mv>
               <value>30</value>
            </mv>
         </d>
      </c2>   
   </b>
</a>
'''

def xml = new XmlParser().parseText(data)
def example = new Example(xml)

example.execute('d.mv.value')
example.execute(['d', 'mv', 'value'])

@groovy.transform.TupleConstructor
class Example {
    Node xml

    def execute(String path) {
        execute(path.tokenize('.'))
    }

    def execute(List<String> properties) {
        def base = xml.b.'*' // This means the base path is a.b.[ANY NODE]

        /* 
         * Calls Node.getAt(String) on each Node.
         * Example:
         * xml.b.'*'.getAt('d').getAt('mv').getAt('value')
         * which is the same as: xml.b.'*'.d.mv.value
         */
        properties.inject(base) {node, propertyName ->
            node.getAt(propertyName)
        }        
    }
}

出力はsのaCollectionですNode値だけが必要な場合は、次のようにすることができexample.execute('d.mv.value').collect { it.value().head() }ます。[29, 30]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メソッドのパラメーターとして使用できるクラスを動的に定義するにはどうすればよいですか?

分類Dev

あるメソッドをパラメータとして別のメソッドに渡すにはどうすればよいですか?

分類Dev

別のクラスのメソッドのパラメーターとして変数を使用するにはどうすればよいですか?

分類Dev

サービスメソッドの引数としてルートパラメータを使用するにはどうすればよいですか?

分類Dev

D:\ abstractクラスに任意のパラメーターを使用して必要なメソッドを作成するにはどうすればよいですか?

分類Dev

メソッドパラメータの一部として独自の完了ハンドラを作成するにはどうすればよいですか

分類Dev

作成するオブジェクトをJavaのメソッドのパラメーターとして渡すにはどうすればよいですか?

分類Dev

install()メソッドのパラメーターとしてキー値を指定するにはどうすればよいですか?

分類Dev

関数として渡された匿名メソッドのパラメーター値を取得するにはどうすればよいですか?

分類Dev

jenkinsパイプラインステージの実行をパラメータから派生した特定のノードエージェントに転送するにはどうすればよいですか?

分類Dev

IVectorのReplaceAllメソッドを使用して、あるIVectorから別のIVectorにデータを転送するにはどうすればよいですか?

分類Dev

URLのパラメーターを使用してコントローラーメソッドで使用するにはどうすればよいですか?

分類Dev

MSTestで複数のパラメータを使用してテストメソッドを実行するにはどうすればよいですか?

分類Dev

bashスクリプトでパラメータを他のコマンドに転送するにはどうすればよいですか?

分類Dev

ラムダ式をパラメーターとしてmongodb'collection.find 'メソッドに挿入するにはどうすればよいですか?

分類Dev

メソッドにパラメーターとして渡されたFunc / Delegate / Expressionを評価するにはどうすればよいですか?

分類Dev

メソッドパラメータの説明を表示するにはどうすればよいですか?

分類Dev

配列内の要素をメソッドパラメータとして設定するにはどうすればよいですか?

分類Dev

メソッドのパラメータとしてlist <T *>を使用するにはどうすればよいですか?

分類Dev

関数のパラメータとしてメソッドを追加するにはどうすればよいですか?

分類Dev

RSpecを使用してパラメーターを使用してメソッドをテストするにはどうすればよいですか?

分類Dev

'lambda'キーワードなしでメソッドを関数パラメーターとして渡すにはどうすればよいですか?

分類Dev

イテレータをパラメータメソッドとして使用するにはどうすればよいですか?

分類Dev

C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

分類Dev

パスパラメータをVPCリンクエンドポイントに転送するにはどうすればよいですか?

分類Dev

Java-メソッドの戻り値の型をパラメーターとして渡すにはどうすればよいですか?

分類Dev

クラスメソッドの戻り値の型に従ってパラメータ型を宣言するにはどうすればよいですか?

分類Dev

複数のパラメーターを使用してC#で拡張メソッドを作成するにはどうすればよいですか?

分類Dev

DbContextクラスに存在するDbSet <>プロパティを、Controllerクラスに存在するActionメソッドのパラメーターとして使用するにはどうすればよいですか?

Related 関連記事

  1. 1

    メソッドのパラメーターとして使用できるクラスを動的に定義するにはどうすればよいですか?

  2. 2

    あるメソッドをパラメータとして別のメソッドに渡すにはどうすればよいですか?

  3. 3

    別のクラスのメソッドのパラメーターとして変数を使用するにはどうすればよいですか?

  4. 4

    サービスメソッドの引数としてルートパラメータを使用するにはどうすればよいですか?

  5. 5

    D:\ abstractクラスに任意のパラメーターを使用して必要なメソッドを作成するにはどうすればよいですか?

  6. 6

    メソッドパラメータの一部として独自の完了ハンドラを作成するにはどうすればよいですか

  7. 7

    作成するオブジェクトをJavaのメソッドのパラメーターとして渡すにはどうすればよいですか?

  8. 8

    install()メソッドのパラメーターとしてキー値を指定するにはどうすればよいですか?

  9. 9

    関数として渡された匿名メソッドのパラメーター値を取得するにはどうすればよいですか?

  10. 10

    jenkinsパイプラインステージの実行をパラメータから派生した特定のノードエージェントに転送するにはどうすればよいですか?

  11. 11

    IVectorのReplaceAllメソッドを使用して、あるIVectorから別のIVectorにデータを転送するにはどうすればよいですか?

  12. 12

    URLのパラメーターを使用してコントローラーメソッドで使用するにはどうすればよいですか?

  13. 13

    MSTestで複数のパラメータを使用してテストメソッドを実行するにはどうすればよいですか?

  14. 14

    bashスクリプトでパラメータを他のコマンドに転送するにはどうすればよいですか?

  15. 15

    ラムダ式をパラメーターとしてmongodb'collection.find 'メソッドに挿入するにはどうすればよいですか?

  16. 16

    メソッドにパラメーターとして渡されたFunc / Delegate / Expressionを評価するにはどうすればよいですか?

  17. 17

    メソッドパラメータの説明を表示するにはどうすればよいですか?

  18. 18

    配列内の要素をメソッドパラメータとして設定するにはどうすればよいですか?

  19. 19

    メソッドのパラメータとしてlist <T *>を使用するにはどうすればよいですか?

  20. 20

    関数のパラメータとしてメソッドを追加するにはどうすればよいですか?

  21. 21

    RSpecを使用してパラメーターを使用してメソッドをテストするにはどうすればよいですか?

  22. 22

    'lambda'キーワードなしでメソッドを関数パラメーターとして渡すにはどうすればよいですか?

  23. 23

    イテレータをパラメータメソッドとして使用するにはどうすればよいですか?

  24. 24

    C ++でテンプレートクラスにパラメータとして渡される基本クラスのメソッドをオーバーロードするにはどうすればよいですか?

  25. 25

    パスパラメータをVPCリンクエンドポイントに転送するにはどうすればよいですか?

  26. 26

    Java-メソッドの戻り値の型をパラメーターとして渡すにはどうすればよいですか?

  27. 27

    クラスメソッドの戻り値の型に従ってパラメータ型を宣言するにはどうすればよいですか?

  28. 28

    複数のパラメーターを使用してC#で拡張メソッドを作成するにはどうすればよいですか?

  29. 29

    DbContextクラスに存在するDbSet <>プロパティを、Controllerクラスに存在するActionメソッドのパラメーターとして使用するにはどうすればよいですか?

ホットタグ

アーカイブ