pentaho/pentaho-kettle · error · KettleXMLException

ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node

ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node

Error message

JobEntryTalendJobExec.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node

What it means

JobEntryTalendJobExec.loadXML first calls super.loadXML and then reads the filename and class_name tags; any KettleXMLException encountered is rethrown as a KettleXMLException with the code-tagged message 'JobEntryTalendJobExec.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node' and the original as cause. It signals the Talend job executor entry could not be rebuilt from its XML node.

Solutions

  1. Validate the <entry> node in the .kjb contains well-formed <filename> and <class_name> tags
  2. Restore the job file from a known-good copy (git history, backup)
  3. Open and re-save the job in a matching Pentaho/Spoon version
  4. Read the chained cause (xe) to pinpoint whether super.loadXML or the tag reads failed

Example fix

// before: truncated node in .kjb
<filename>talend_job</filename>
<!-- class_name tag missing / file truncated -->
// after
<filename>/jobs/myJob.jar</filename>
<class_name>myjob.MyJob</class_name>
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: check required tags exist before loadXML
if (XMLHandler.getTagValue(entrynode, "filename") == null) {
  throw new KettleXMLException("TalendJobExec entry missing <filename> tag");
}

Type guard

if (entrynode != null && XMLHandler.getNodeByTag(entrynode, "filename") != null) { /* safe */ }

Try / catch

try {
  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  logError("ERROR_0001: " + e.getCause(), e);
  // restore job file from backup or recreate the entry in Spoon
}

Prevention

When it happens

Trigger: Calling loadXML on a job entry node when the parent JobEntryBase.loadXML fails or XMLHandler.getTagValue throws due to malformed/unexpected XML content for filename or class_name.

Common situations: Hand-edited or corrupted .kjb files; missing nested tags after a partial file write or bad merge in version control; a job exported by a newer Pentaho version and loaded by an older one with a different XML layout.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/3b807ff36aebcc39. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/talendjobexec/JobEntryTalendJobExec.java:105

  public String getXML() {
    StringBuilder retval = new StringBuilder( 50 );

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "filename", filename ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "class_name", className ) );

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,
    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      filename = XMLHandler.getTagValue( entrynode, "filename" );
      className = XMLHandler.getTagValue( entrynode, "class_name" );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryTalendJobExec.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node" ), xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      filename = rep.getJobEntryAttributeString( id_jobentry, "filename" );
      className = rep.getJobEntryAttributeString( id_jobentry, "class_name" );
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryTalendJobExec.ERROR_0002_Cannot_Load_Job_From_Repository", id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "filename", filename );

View on GitHub (pinned to f3058517a1)