2014-12-27 5 views
4

이 코드가 XML 문자열에서 특정 노드를 가져 오지 못하는 이유를 알 수 없습니다. 아래 코드는이 오류가 발생합니다 : groovy.util.slurpersupport.NodeChildren.attributes()를 인수 유형에 적용 :() 값을 [] 어떤 설명을위한XML에서 노드 가져 오기

덕분에이 문제를 해결하는 방법! inputBindings 때문에

def xml ='''<ProcessDefinition> 
    <activity name="MergeLogData"> 
     <inputBindings> 
      <SubmitLogMsgRequest> 
       <MsgLevel> 
        <value-of select="$Start/SubmitLogMsgRequest/MsgLevel"/> 
       </MsgLevel> 
       <for-each select="SubmitLogMsgRequest/LogMsg"> 
        <LogMsg> 
         <for-each select="ErrorReport"> 
          <ErrorReport> 
           <MsgCode> 
            <value-of select="MsgCode"/> 
           </MsgCode> 
          </ErrorReport> 
         </for-each> 
        </LogMsg> 
       </for-each> 
      </SubmitLogMsgRequest> 
     </inputBindings> 
    </activity> 
</ProcessDefinition>''' 


groovy.util.slurpersupport.GPathResult Process = new XmlSlurper().parseText(xml) 

Process.depthFirst().grep { it.name()=="activity" && [email protected]=="MergeLogData"}.each{activity-> 
    traverse(activity.inputBindings) // why is it not possible to point to the sub node "inputBindings" here ?? 
    //traverse(activity) this would work, but its pointing to the wrong node, I want it to be "inputBindings" 
} 

public void traverse(node) { 
    StringBuffer ret = new StringBuffer() 
    node.attributes().each(){attribute -> 
     println "ATTRIBUTE VALUE: $attribute.value" 
    } 

    node.children().each {child-> 
      if(child.name().length()>0) 
       println "NODE name: ${child.name()}" 
      traverse(child) 
    }   
}  

답변

4

노드의 모음입니다 - inputBindings 여러가있을 수 있습니다. 수정 된 코드 :

def xml ='''<ProcessDefinition> 
    <activity name="MergeLogData"> 
     <inputBindings> 
      <SubmitLogMsgRequest> 
       <MsgLevel> 
        <value-of select="$Start/SubmitLogMsgRequest/MsgLevel"/> 
       </MsgLevel> 
       <for-each select="SubmitLogMsgRequest/LogMsg"> 
        <LogMsg> 
         <for-each select="ErrorReport"> 
          <ErrorReport> 
           <MsgCode> 
            <value-of select="MsgCode"/> 
           </MsgCode> 
          </ErrorReport> 
         </for-each> 
        </LogMsg> 
       </for-each> 
      </SubmitLogMsgRequest> 
     </inputBindings> 
    </activity> 
</ProcessDefinition>''' 


groovy.util.slurpersupport.GPathResult Process = new XmlSlurper().parseText(xml) 

Process.depthFirst().grep { it.name()=="activity" && [email protected]=="MergeLogData"}.each{activity-> 
    traverse(activity.inputBindings[0]) 
} 

public void traverse(node) { 
    StringBuffer ret = new StringBuffer() 
    node.attributes().each(){attribute -> 
     println "ATTRIBUTE VALUE: $attribute.value" 
    } 

    node.children().each {child-> 
      if(child.name().length()>0) 
       println "NODE name: ${child.name()}" 
      traverse(child) 
    }   
}