2017-09-06 20 views
0

背景:XMLからすべての属性と値を取得しようとしています。私はXmlParserとXmlSlurperを使ってみました。私は他の提案(これはXMLのJIRAワークフローで、値をレポートに入れようとしています)に公開しています。ネストされたXMLからの属性と値の解析

属性()を実行すると、トップレベルには何も戻されません。それで、それをそれぞれの()に動かすと、それが利用可能になります。最初の3つの戻り値は正しく動作しますが、次の各配列でそれぞれを実行しない限り、次の 'レベル'は戻りません。私は本当にこれで何をすべきかはわかりません。各ワークフローの長さは異なります。私は正規表現のいくつかの並べ替えについて考えたが、それはワークフローのさまざまな長さと種類で実行可能なようには思われませんでした。これは非常に基本的なワークフローです。他のものははるかに複雑であり、ステップ数や属性はさまざまです。
childrenメソッドを実行すると値が返されますが、ノードクラスではなくリストになります。私はそれが値のために返すものを示すためにここに置いた。助言がありますか?

def xml = 
    //'<?xml version="1.0" encoding="UTF-8"?>\n' + 
    //'<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.8//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">\n' + 
    '<workflow>\n' + 
      ' <meta name="jira.description"></meta>\n' + 
      ' <meta name="jira.update.author.key">admin</meta>\n' + 
      ' <meta name="jira.updated.date">1503954892468</meta>\n' + 
      ' <initial-actions>\n' + 
      ' <action id="1" name="Create">\n' + 
      '  <meta name="jira.i18n.submit">common.forms.create</meta>\n' + 
      '  <meta name="jira.i18n.title">common.forms.create</meta>\n' + 
      '  <validators>\n' + 
      '  <validator name="" type="class">\n' + 
      '   <arg name="permission">Create Issue</arg>\n' + 
      '   <arg name="class.name">com.atlassian.jira.workflow.validator.PermissionValidator</arg>\n' + 
      '  </validator>\n' + 
      '  </validators>\n' + 
      '  <results>\n' + 
      '  <unconditional-result old-status="null" status="open" step="1">\n' + 
      '   <post-functions>\n' + 
      '   <function type="class">\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueCreateFunction</arg>\n' + 
      '   </function>\n' + 
      '   <function type="class">\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '   </function>\n' + 
      '   <function type="class">\n' + 
      '    <arg name="eventTypeId">1</arg>\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '   </function>\n' + 
      '   </post-functions>\n' + 
      '  </unconditional-result>\n' + 
      '  </results>\n' + 
      ' </action>\n' + 
      ' </initial-actions>\n' + 
      ' <steps>\n' + 
      ' <step id="1" name="To Do">\n' + 
      '  <meta name="jira.status.id">10000</meta>\n' + 
      '  <actions>\n' + 
      '  <action id="11" name="Start Progress">\n' + 
      '   <meta name="jira.i18n.submit">startprogress.title</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">startprogress.title</meta>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="2">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowassigntocurrentuser-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.AssignToCurrentUserFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  <action id="21" name="Done">\n' + 
      '   <meta name="jira.i18n.submit">jira.issuetracking.simple.workflow.action.done.name</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">jira.issuetracking.simple.workflow.action.done.name</meta>\n' + 
      '   <restrict-to>\n' + 
      '   <conditions>\n' + 
      '    <condition type="class">\n' + 
      '    <arg name="permission">RESOLVE_ISSUES</arg>\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.condition.PermissionCondition</arg>\n' + 
      '    </condition>\n' + 
      '   </conditions>\n' + 
      '   </restrict-to>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="3">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="field.name">resolution</arg>\n' + 
      '     <arg name="field.value">10000</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  </actions>\n' + 
      ' </step>\n' + 
      ' <step id="2" name="In Progress">\n' + 
      '  <meta name="jira.status.id">3</meta>\n' + 
      '  <actions>\n' + 
      '  <action id="31" name="Stop Progress">\n' + 
      '   <meta name="jira.i18n.submit">stopprogress.title</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">stopprogress.title</meta>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="1">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  <action id="41" name="Done">\n' + 
      '   <meta name="jira.i18n.submit">jira.issuetracking.simple.workflow.action.done.name</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">jira.issuetracking.simple.workflow.action.done.name</meta>\n' + 
      '   <restrict-to>\n' + 
      '   <conditions>\n' + 
      '    <condition type="class">\n' + 
      '    <arg name="permission">RESOLVE_ISSUES</arg>\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.condition.PermissionCondition</arg>\n' + 
      '    </condition>\n' + 
      '   </conditions>\n' + 
      '   </restrict-to>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="3">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="field.name">resolution</arg>\n' + 
      '     <arg name="field.value">10000</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  </actions>\n' + 
      ' </step>\n' + 
      ' <step id="3" name="Done">\n' + 
      '  <meta name="jira.status.id">10001</meta>\n' + 
      '  <actions>\n' + 
      '  <action id="51" name="Reopen">\n' + 
      '   <meta name="jira.i18n.submit">jira.issuetracking.simple.workflow.action.reopen.name</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">jira.issuetracking.simple.workflow.action.reopen.name</meta>\n' + 
      '   <restrict-to>\n' + 
      '   <conditions>\n' + 
      '    <condition type="class">\n' + 
      '    <arg name="permission">RESOLVE_ISSUES</arg>\n' + 
      '    <arg name="class.name">com.atlassian.jira.workflow.condition.PermissionCondition</arg>\n' + 
      '    </condition>\n' + 
      '   </conditions>\n' + 
      '   </restrict-to>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="1">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="field.name">resolution</arg>\n' + 
      '     <arg name="field.value"></arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  <action id="61" name="Reopen and start progress">\n' + 
      '   <meta name="jira.i18n.submit">jira.issuetracking.simple.workflow.action.reopenandstartprogress.name</meta>\n' + 
      '   <meta name="jira.description"></meta>\n' + 
      '   <meta name="jira.i18n.title">jira.issuetracking.simple.workflow.action.reopenandstartprogress.name</meta>\n' + 
      '   <results>\n' + 
      '   <unconditional-result old-status="Not Done" status="Done" step="2">\n' + 
      '    <post-functions>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="field.name">resolution</arg>\n' + 
      '     <arg name="field.value"></arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueFieldFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowupdateissuestatus-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.UpdateIssueStatusFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowassigntocurrentuser-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.AssignToCurrentUserFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowcreatecomment-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.misc.CreateCommentFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowgeneratechangehistory-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowreindexissue-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.issue.IssueReindexFunction</arg>\n' + 
      '    </function>\n' + 
      '    <function type="class">\n' + 
      '     <arg name="eventTypeId">13</arg>\n' + 
      '     <arg name="full.module.key">com.atlassian.jira.plugin.system.workflowfireevent-function</arg>\n' + 
      '     <arg name="class.name">com.atlassian.jira.workflow.function.event.FireIssueEventFunction</arg>\n' + 
      '    </function>\n' + 
      '    </post-functions>\n' + 
      '   </unconditional-result>\n' + 
      '   </results>\n' + 
      '  </action>\n' + 
      '  </actions>\n' + 
      ' </step>\n' + 
      ' </steps>\n' + 
      '</workflow>\n' + 
      '' 

def doc = new XmlParser().parseText(xml) 
def attr = doc.attributes() //no results 

doc.each { 

    if (it.attributes()) { 
     println(it.name()) 
     println(it.attributes()) 
     println(it.value()) 
     println "" 
    } else { 
     println (it.children()) 

    } 

    } 

出力:

meta 
[name:jira.description] 
[] 

meta 
[name:jira.update.author.key] 
[admin] 

meta 
[name:jira.updated.date] 
[1503954892468] 

[action[attributes={id=1, name=Create}; value=[meta[attributes={name=jira.i18n.submit}; value=[common.forms.create]], meta[attributes={name=jira.i18n.title}; value=[common.forms.create]], validators[attributes={}; value=[validator[attributes={name=, type=class}; value=[arg[attributes={name=permission}; value=[Create Issue]], arg[attributes={name=class.name}; value=[com.atlassian.jira.workflow.validator.PermissionValidator]]]]]], results[attributes={}; value=[unconditional-result[attributes={old-status=null, status=open, step=1}; value=[post-functions[attributes={}; value=[function[attributes={type=class}; value=[arg[attributes={name=class.name}; value=[com.atlassian.jira.workflow.function.issue.IssueCreateFunction]]]], function[attributes={type=class}; value=[arg[attributes={name=class.name}; value=[com.atlassian.jira.workflow.function.issue.IssueReindexFunction]]]], function[attributes={type=class}; value=[arg[attributes={name=eventTypeId}; value=[1]], arg[attributes={name=class.name}; value=[com.atlassian.jira.workflow.function.event.FireIssueEventFunction]]]]]]]]]]]]] 
... 

所望の出力: は、好ましくは、このようないくつかの形式で、すべての属性と値を取得する:

attribute name : value 

jira.updated.date : 1503954892468 

jira.update.author.key : admin 
+0

を試すことができます。表示されている出力が正しいかどうかそうでなければ、何が望ましい出力です。 – Rao

+0

下部にセクションを追加しました。属性名と関連する値を取得するだけです。問題は、出力値が正しくないということではなく、(配列に従うのではなく)読みやすい形式でそれらを得ることができず、属性と対応する値を示しているということだけではありません。 –

+0

すべての属性が「」要素のみになりますか? – Rao

答えて

0

以下のスクリプトを考え -

  • を検索する0 meta要素
  • name属性とそのテキストを含むマップを作成します。
  • が最後にマップを印刷します。

大きなスペースを避けるためにxml文字列を含まないとにかく、あなたはそれを持っています。

def metas = new XmlSlurper().parseText(xml).'**'.findAll {it.name() == 'meta'} 
def metaAttributeMap = metas.collectEntries{ [([email protected]):it.text()]} 
metaAttributeMap.each {k,v -> println "$k : $v"} 

すばやく正確な問題が何であるかを同じオンラインdemo

+0

ありがとうございました。これは、要素のみを取得します。ワイルドカード文字を使用して、属性と値を持つすべての要素を返すもう1つの方法はありますか?属性が事前にどのようなものになるのか明確でない場合があります。 例:

関連する問題