{"record":{"id":"72a6bfa620d6e9b9","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-shell-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'shell' from XML node","messagePattern":"Unable to load job entry of type 'shell' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/shell/JobEntryShell.java","lineNumber":185,"sourceCode":"      insertScript = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"insertScript\" ) );\n\n      script = XMLHandler.getTagValue( entrynode, \"script\" );\n\n      // How many arguments?\n      int argnr = 0;\n      while ( XMLHandler.getTagValue( entrynode, \"argument\" + argnr ) != null ) {\n        argnr++;\n      }\n      allocate( argnr );\n\n      // Read them all...\n      // THIS IS A VERY BAD WAY OF READING/SAVING AS IT MAKES\n      // THE XML \"DUBIOUS\". DON'T REUSE IT.\n      for ( int a = 0; a < argnr; a++ ) {\n        arguments[a] = XMLHandler.getTagValue( entrynode, \"argument\" + a );\n      }\n    } catch ( KettleException e ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'shell' from XML node\", e );\n    }\n  }\n\n  // Load the jobentry from repository\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n    List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      setFileName( rep.getJobEntryAttributeString( id_jobentry, \"file_name\" ) );\n      setWorkDirectory( rep.getJobEntryAttributeString( id_jobentry, \"work_directory\" ) );\n      argFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, \"arg_from_previous\" );\n      execPerRow = rep.getJobEntryAttributeBoolean( id_jobentry, \"exec_per_row\" );\n\n      setLogfile = rep.getJobEntryAttributeBoolean( id_jobentry, \"set_logfile\" );\n      setAppendLogfile = rep.getJobEntryAttributeBoolean( id_jobentry, \"set_append_logfile\" );\n      addDate = rep.getJobEntryAttributeBoolean( id_jobentry, \"add_date\" );\n      addTime = rep.getJobEntryAttributeBoolean( id_jobentry, \"add_time\" );\n      logfile = rep.getJobEntryAttributeString( id_jobentry, \"logfile\" );\n      logext = rep.getJobEntryAttributeString( id_jobentry, \"logext\" );","sourceCodeStart":167,"sourceCodeEnd":203,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/shell/JobEntryShell.java#L167-L203","documentation":"JobEntryShell.loadXML parses the job entry's XML node into fields; any KettleException raised while reading tags is wrapped in KettleXMLException('Unable to load job entry of type 'shell' from XML node'). The message identifies which job entry type failed to deserialize, with the parse error as cause.","triggerScenarios":"XMLHandler.getTagValue calls throw (malformed XML document, null entrynode) while loading a 'shell' job entry from a .kjb file, including reading the repeated argument0..argumentN tags.","commonSituations":"Hand-edited or truncated .kjb files; XML saved by a newer/older Pentaho version with divergent tag layout; copy-paste of job entries losing attributes; invalid characters in arguments breaking XML escaping.","solutions":["Open the .kjb in an XML editor and validate it is well-formed","Compare the shell job entry node against a working one (check argument0..argumentN tags and argnr)","Recreate the shell job entry in Spoon and re-save the job file","Restore the file from version control/backup if it was truncated"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  jobEntryShell.loadXML(entrynode, databases, metaStore);\n} catch (KettleXMLException e) {\n  logError(\"Shell job entry XML invalid: \" + e.getCause().getMessage(), e);\n  // fall back to re-creating the entry or loading a backup .kjb\n}","preventionTips":["Do not hand-edit .kjb files; edit via Spoon","Keep argument0..argumentN tags consistent with the argnr value","Version-control job files so truncated edits can be reverted","Validate XML after any external generation/templating of job files"],"tags":["xml","parsing","job-entry","shell","kettle"],"backgroundTag":"xml-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}