pentaho/pentaho-kettle · error · KettleXMLException
JobEntryDeleteResultFilenames.CanNotLoadFromXML
Error message
JobEntryDeleteResultFilenames.CanNotLoadFromXML
What it means
Thrown when the XML for a 'Delete Result Filenames' job entry cannot be parsed during loadXML(). It wraps the original KettleXMLException and includes its message. Indicates the job entry's XML node is malformed or missing expected tags (foldername, specify_wildcard, wildcard, wildcardexclude).
Solutions
- Validate the .kjb XML for well-formedness and presence of the DeleteResultFilenames tags
- Regenerate the job entry from Spoon to produce valid XML
- Confirm you pass the correct <entry> node to loadXML()
- Read xe.getMessage() embedded in the thrown error to locate the parse failure
Example fix
// before
Node entrynode = XMLHandler.getSubNode(je, "entry"); // could be null / wrong type
entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
// after
Node entrynode = XMLHandler.getSubNode(je, "entry");
if (entrynode == null) throw new KettleXMLException("No <entry> node found");
try {
entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
logError("XML malformed: " + e.getMessage());
throw e;
} Defensive patterns
Strategy: try-catch
Validate before calling
// validate XML before loadXML
Document doc = XMLHandler.loadXMLFile(new File(kjbPath));
if (doc == null) throw new IllegalArgumentException("Not valid XML: " + kjbPath);
Node entry = XMLHandler.getSubNode(doc.getDocumentElement(), "entry");
if (entry == null || XMLHandler.getTagValue(entry, "foldername") == null
&& XMLHandler.getSubNode(entry, "foldername") == null) {
logBasic("Warning: DeleteResultFilenames entry has no foldername tag");
} Type guard
boolean isValidEntryNode(Node node) {
return node != null && "entry".equals(node.getNodeName());
} Try / catch
try {
entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
logError("CanNotLoadFromXML: " + e.getMessage());
throw e;
} Prevention
- Validate .kjb XML files after any external manipulation
- Regenerate corrupted entries from Spoon rather than patching XML
- Pin consistent Pentaho versions across environments
- Store jobs in version control to recover clean copies
When it happens
Trigger: Calling loadXML() on a .kjb fragment where XMLHandler.getTagValue for the entry's tags throws a KettleXMLException — typically malformed XML structure or wrong node type passed in.
Common situations: Truncated or hand-edited .kjb files; schema drift between Pentaho versions; loading a node from the wrong entry type; encoding corruption in the XML file.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- ERROR_0001
- JobDosToUnix.Error.Exception.UnableLoadXML
- JobEntryDeleteFolders.UnableToLoadFromXml
- JobEntrySimple.Error.Exception.UnableLoadXML
- JobFoldersCompare.Meta.UnableLoadXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/54d6fbe20398150b.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/deleteresultfilenames/JobEntryDeleteResultFilenames.java:102
retval.append( " " ).append( XMLHandler.addTagValue( "foldername", foldername ) );
retval.append( " " ).append( XMLHandler.addTagValue( "specify_wildcard", specifywildcard ) );
retval.append( " " ).append( XMLHandler.addTagValue( "wildcard", wildcard ) );
retval.append( " " ).append( XMLHandler.addTagValue( "wildcardexclude", wildcardexclude ) );
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" );
specifywildcard = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "specify_wildcard" ) );
wildcard = XMLHandler.getTagValue( entrynode, "wildcard" );
wildcardexclude = XMLHandler.getTagValue( entrynode, "wildcardexclude" );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "JobEntryDeleteResultFilenames.CanNotLoadFromXML", xe.getMessage() ) );
}
}
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" );
specifywildcard = rep.getJobEntryAttributeBoolean( id_jobentry, "specify_wildcard" );
wildcard = rep.getJobEntryAttributeString( id_jobentry, "wildcard" );
wildcardexclude = rep.getJobEntryAttributeString( id_jobentry, "wildcardexclude" );
} catch ( KettleException dbe ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "JobEntryDeleteResultFilenames.CanNotLoadFromRep", "" + id_jobentry, dbe.getMessage() ) );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {View on GitHub (pinned to f3058517a1)