2017-09-06 11 views
0

배경 : XML에서 모든 특성 및 값을 가져 오려고합니다. 나는 XmlSlurper뿐만 아니라 XmlParser를 사용해 보았습니다. 다른 제안 (XML의 JIRA 워크 플로우, 리포트에 값을 넣으려는 시도)에 대해 공개적입니다.중첩 된 XML의 특성 및 값을 구문 분석하십시오.

속성을 실행하면 최상위 수준에서 아무 것도 반환하지 않습니다. 그래서 각각을()로 실행하면 사용할 수 있습니다. 처음 세 반환 값은 제대로 작동하지만 다음 'level'은 각 다음 배열에서 각각을 실행하지 않는 한 올바르게 작동하지 않습니다. 나는 이것에 무엇을해야하는지 정말로 모른다. 각 워크 플로우의 길이는 다양합니다. 나는 일종의 정규식에 대해 생각했지만 그것은 워크 플로우의 길이와 종류가 다양 할 때 실행 가능할 것 같지 않았다. 이는 매우 기본적인 워크 플로입니다. 다른 것들은 훨씬 더 복잡하고 단계와 속성의 수는 다양합니다.
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

아래 스크립트 것 -

  • 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

도움 주셔서 감사합니다. 이것은 요소 만 가져옵니다. 와일드 카드 문자를 사용하여 속성과 값이있는 모든 요소를 ​​반환하는 또 다른 방법이 있습니까? 속성이 사전에 무엇인지 명확하지 않은 경우가 있습니다. 예 :