pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry of type 'create folder' from XML…

Error message

Unable to load job entry of type 'create folder' from XML node

What it means

JobEntryCreateFolder.loadXML throws this KettleXMLException with a hard-coded message when the XML node for the 'create folder' job entry cannot be parsed. The original KettleXMLException is chained as cause. It indicates the 'foldername' or 'fail_of_folder_exists' settings could not be deserialized from the job XML.

Solutions

  1. Validate and repair the job XML so the entry node contains well-formed <foldername> and <fail_of_folder_exists> tags.
  2. Check getCause() of the thrown exception for the exact parser error.
  3. Recreate the entry in Spoon and re-save the job.
  4. Restore the .kjb from version control or backup if corrupted.
Defensive patterns

Strategy: try-catch

Validate before calling

if (entrynode == null || XMLHandler.getTagValue(entrynode, "foldername") == null) {
  throw new IllegalArgumentException("create folder entry missing <foldername>");
}

Try / catch

try {
  jobEntry.loadXML(entrynode, databases, slaveServers);
} catch (KettleXMLException e) {
  logError("Bad 'create folder' entry XML: " + e.getCause(), e);
  // rebuild entry with defaults or fail the job load with a clear message
}

Prevention

When it happens

Trigger: Calling loadXML on a 'create folder' entry node with malformed XML: unclosed tags, invalid characters, missing 'foldername'/'fail_of_folder_exists' elements, or an invalid entrynode passed in.

Common situations: Corrupted .kjb files from failed transfers or manual edits; XML produced by external tooling with wrong tag names; version skew between the tool that wrote the file and Pentaho reading it.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/createfolder/JobEntryCreateFolder.java:95

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "foldername", foldername ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "fail_of_folder_exists", failOfFolderExists ) );
    if ( parentJobMeta != null ) {
      parentJobMeta.getNamedClusterEmbedManager().registerUrl( foldername );
    }

    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 );
      foldername = XMLHandler.getTagValue( entrynode, "foldername" );
      failOfFolderExists = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "fail_of_folder_exists" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'create folder' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
      failOfFolderExists = rep.getJobEntryAttributeBoolean( id_jobentry, "fail_of_folder_exists" );
    } catch ( KettleException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'create Folder' from the repository for id_jobentry=" + id_jobentry,
        dbe );
    }
  }

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

View on GitHub (pinned to f3058517a1)