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
Thrown by JobEntryFolderIsEmpty.loadXML when the 'folder is empty' job entry cannot be deserialized from its XML node. It wraps the KettleXMLException with a hardcoded (non-localized) message. Note the message misleadingly says 'create folder' although the entry is folderisempty. It means the entry's XML attributes could not be read.
Solutions
- Re-create the entry in Spoon to regenerate valid XML
- Verify the node contains foldername, include_subfolders, specify_wildcard and wildcard child tags
- Inspect the chained KettleXMLException cause for the parse error
- Restore the .kjb from version control or a backup
Example fix
// before <entry name='FolderEmpty'><foldername>/data</foldername></entry> // after <entry name='FolderEmpty'><foldername>/data</foldername><include_subfolders>N</include_subfolders><specify_wildcard>N</specify_wildcard><wildcard></wildcard></entry>
Defensive patterns
Strategy: try-catch
Validate before calling
// Java: validate required tags before loading
if (XMLHandler.getSubNode(entrynode, "foldername") == null) {
throw new IllegalArgumentException("folderisempty entry missing <foldername>");
} Try / catch
try {
jobEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
logError("Corrupt folderisempty entry XML (message says 'create folder' but is folderisempty): " + e.getMessage(), e);
// skip or rebuild the entry
} Prevention
- Do not copy XML between different entry types (create folder vs folder isempty)
- Edit entries only via Spoon
- Validate .kjb XML after external transformations
- Keep Kettle versions consistent across environments
When it happens
Trigger: Loading a .kjb whose <entry> node for this type is malformed or missing foldername/include_subfolders/specify_wildcard/wildcard tags, or whose super.loadXML fails on base attributes.
Common situations: Hand-edited .kjb; truncated file; XML from a different Kettle version with renamed tags; copy-paste from a 'create folder' entry producing wrong structure.
Related errors
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001_Unable_To_Load_From_Xml_Node
- JobEntryAbort.UnableToLoadFromXml.Label
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ff50987201b5944a.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/folderisempty/JobEntryFolderIsEmpty.java:109
retval.append( " " ).append( XMLHandler.addTagValue( "include_subfolders", includeSubfolders ) );
retval.append( " " ).append( XMLHandler.addTagValue( "specify_wildcard", specifywildcard ) );
retval.append( " " ).append( XMLHandler.addTagValue( "wildcard", wildcard ) );
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" );
includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );
specifywildcard = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "specify_wildcard" ) );
wildcard = XMLHandler.getTagValue( entrynode, "wildcard" );
} 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" );
includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );
specifywildcard = rep.getJobEntryAttributeBoolean( id_jobentry, "specify_wildcard" );
wildcard = rep.getJobEntryAttributeString( id_jobentry, "wildcard" );
} 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 {View on GitHub (pinned to f3058517a1)