2014-12-27 219 views
4

我不明白为什么这段代码无法从xml字符串中获取某个节点。 下面的代码会抛出这个错误:groovy.util.slurpersupport.NodeChildren.attributes()是适用于参数类型:()值:[]从xml中获取节点

感谢任何解释如何解决这个!

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是节点的集合 - 可能有多个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) 
    }   
}