2017-03-19 15 views
0

groovyスクリプトを使用してXMLファイルを作成しようとしています。 2つのものをループする必要があるため、結果として得られるXMLには、ユーザーが渡したすべてのオブジェクトが含まれます。ここでgroovy xml builder内の入れ子ループ

コードが最初のループで、これまでのところです:

import groovy.xml.* 

//map to loop 
def workflows = [[ name: "A", file: "fileA" , objectName: "wf_A" , objectType: "workflow", sourceRepository: "DEV2"], 
[ name: 'B' , file: 'fileB' , objectName: 'wf_B' , objectType: 'workflow', sourceRepository: 'DEV2']] 

// def folderNameMap = [[ srcFolder: ["srcFolder1", "srcFolder2"], TgtFolder: ["TgtFolder1", "TgtFolder2"]], 
// [srcFolder: ["srcFolder3"], TgtFolder: ["TgtFolder3"]] 
// ] 


def builder = new StreamingMarkupBuilder() 
builder.encoding = 'UTF-8' 
def xml = builder.bind { 
    mkp.xmlDeclaration() 
    'udm.DeploymentPackage'(version:'$BUILD_NUMBER', application: "informaticaApp"){ 
    deployables { 
     workflows.each { item -> 
     'powercenter.PowercenterXml'(name:item.name, file:item.file){ 
     scanPlaceholders{ mkp.yield(true) } 
     sourceRepository{ mkp.yield(item.sourceRepository) } 
     'folderNameMap' { 
      entry(key:"multifolder", "{{multifolderTST}}") // <- this is hard code and i want to remove this 
     } 
     'objectNames' { 
      value { mkp.yield(item.objectName) } 
     } 
     'objectTypes' { 
      value { mkp.yield(item.objectType) } 
     } 
     } 
    } 
    } 
    dependencyResolution{ mkp.yield('LATEST') } 
    undeployDependencies{ mkp.yield(false) } 
    } 
} 

println XmlUtil.serialize(xml) 

結果XMLは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?><udm.DeploymentPackage version="$BUILD_NUMBER" application="informaticaApp"> 
    <deployables> 
    <powercenter.PowercenterXml name="A" file="fileA"> 
     <scanPlaceholders>true</scanPlaceholders> 
     <sourceRepository>DEV2</sourceRepository> 
     <folderNameMap> 
     <entry key="multifolder">{{multifolderTST}}</entry> 
     </folderNameMap> 
     <objectNames> 
     <value>wf_A</value> 
     </objectNames> 
     <objectTypes> 
     <value>workflow</value> 
     </objectTypes> 
    </powercenter.PowercenterXml> 
    <powercenter.PowercenterXml name="B" file="fileB"> 
     <scanPlaceholders>true</scanPlaceholders> 
     <sourceRepository>DEV2</sourceRepository> 
     <folderNameMap> 
     <entry key="multifolder">{{multifolderTST}}</entry> 
     </folderNameMap> 
     <objectNames> 
     <value>wf_B</value> 
     </objectNames> 
     <objectTypes> 
     <value>workflow</value> 
     </objectTypes> 
    </powercenter.PowercenterXml> 
    </deployables> 
    <dependencyResolution>LATEST</dependencyResolution> 
    <undeployDependencies>false</undeployDependencies> 
</udm.DeploymentPackage> 

これは、「ワークフロー」と宣言したマップのループを実現しています。 XMLには反復処理が必要な別のエントリがあります。スクリプト内のセクションでは、私は繰り返し、このセクションを持っており、複数の値がスクリプトに供給された場合、結果のXMLに新しい行エントリを作成する必要が

'folderNameMap' { 
       entry(key:"multifolder", "{{multifolderTST}}") // <- this is hard code and i want to remove this 
      } 

です。以下のような:結果のXMLは次のようになりますように

<folderNameMap> 
    <entry key="multifolder">{{multifolderTST}}</entry> 
    <entry key="multifolder2">{{multifolderTST2}}</entry> 
    <entry key="multifolder3">{{multifolderTST3}}</entry> 
    </folderNameMap> 

は、どのように私は、この第二マップを定義することができます。(foldermapはマップである私は一つだけsrcFolderとtgtFolderが与えられたか、そこに意志のケースを持っていますので、複数srcFolderのANBのTgtFoldersが与えられたがあるだろう時に倍になる。)

<?xml version="1.0" encoding="UTF-8"?><udm.DeploymentPackage version="$BUILD_NUMBER" application="informaticaApp"> 
    <deployables> 
    <powercenter.PowercenterXml name="A" file="fileA"> 
     <scanPlaceholders>true</scanPlaceholders> 
     <sourceRepository>DEV2</sourceRepository> 
     <folderNameMap> 
     <entry key="multifolder">{{multifolderTST}}</entry> 
     </folderNameMap> 
     <objectNames> 
     <value>wf_A</value> 
     </objectNames> 
     <objectTypes> 
     <value>workflow</value> 
     </objectTypes> 
    </powercenter.PowercenterXml> 
    <powercenter.PowercenterXml name="B" file="fileB"> 
     <scanPlaceholders>true</scanPlaceholders> 
     <sourceRepository>DEV2</sourceRepository> 
     <folderNameMap> 
     <entry key="multifolder1">{{multifolderTST1}}</entry> 
     <entry key="multifolder2">{{multifolderTST2}}</entry> 
     <entry key="multifolder3">{{multifolderTST3}}</entry> 
     </folderNameMap> 
     <objectNames> 
     <value>wf_B</value> 
     </objectNames> 
     <objectTypes> 
     <value>workflow</value> 
     </objectTypes> 
    </powercenter.PowercenterXml> 
    </deployables> 
    <dependencyResolution>LATEST</dependencyResolution> 
    <undeployDependencies>false</undeployDependencies> 
</udm.DeploymentPackage> 
+0

もっと簡単な例がありますか?これは一度に消化する巨大な質問です –

答えて

1

だから、私はここに暗闇の中で刺しを取っている(私は100%ではないんだと)私はあなたの質問が何であるかを知っていることを確認、入力リストを次のように変更することができます:

def workflows = [ 
    [ name: 'A', 
     file: 'fileA', 
     objectName: 'wf_A', 
     objectType: 'workflow', 
     sourceRepository: 'DEV2', 
     folderNames: [ multifolder: '{{multifolderTST}}', 
        multifolder2: '{{multifolderTST2}}' ]], 
    [ name: 'B', 
     file: 'fileB', 
     objectName: 'wf_B', 
     objectType: 'workflow', 
     sourceRepository: 'DEV2', 
     folderNames: [ multifolder3: '{{multifolderTST3}}', 
        multifolder4: '{{multifolderTST4}}' ]] 
] 

次に、次のようにしてください:

def builder = new StreamingMarkupBuilder() 
builder.encoding = 'UTF-8' 
def xml = builder.bind { 
    mkp.xmlDeclaration() 
    'udm.DeploymentPackage'(version:'$BUILD_NUMBER', application: "informaticaApp"){ 
    deployables { 
     workflows.each { item -> 
     'powercenter.PowercenterXml'(name:item.name, file:item.file) { 
      scanPlaceholders(true) 
      sourceRepository(item.sourceRepository) 
      folderNameMap { 
      item.folderNames.each { name, value -> 
       entry(key:name, value) 
      } 
      } 
      objectNames { 
      value(item.objectName) 
      } 
      objectTypes { 
      value(item.objectType) 
      } 
     } 
     } 
    } 
    dependencyResolution('LATEST') 
    undeployDependencies(false) 
    } 
} 
+0

ありがとう、これは私が探していたものです。マップ内のマップ内の繰り返し。 – OK999