2014-12-27 5 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) 
    }   
} 
Смежные вопросы