pentaho/pentaho-kettle · error · KettleXMLException
JobEntryDeleteFiles.UnableToLoadFromXml
Error message
JobEntryDeleteFiles.UnableToLoadFromXml
What it means
JobEntryDeleteFiles.loadXML throws this KettleXMLException when parsing the delete-files entry's XML node fails, including reading the <fields>/<field> blocks with 'name' and 'filemask' sub-tags. The original KettleXMLException is chained. It means the wildcard file-delete entry could not be deserialized from the job XML.
Solutions
- Open the .kjb and verify the <fields> block with <field><name>...</name><filemask>...</filemask></field> entries is intact
- Recreate the Delete files entry in Spoon and re-save the job
- Validate the full XML with a parser to locate the malformed node
- Check the chained cause (xe) for the exact XML path that failed
Example fix
// before
<fields>
<field>
<name>/tmp/logs/</name>
</fields>
// after
<fields>
<field>
<name>/tmp/logs/</name>
<filemask>.*\\.log</filemask>
</field>
</fields> Defensive patterns
Strategy: validation
Validate before calling
// before loadXML
Node fields = XMLHandler.getSubNode(entrynode, "fields");
if (fields == null) throw new KettleXMLException("Missing <fields> in Delete files entry");
int n = XMLHandler.countNodes(fields, "field");
if (n == 0) throw new KettleXMLException("No <field> entries in Delete files entry"); Try / catch
try {
entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
log.error("DeleteFiles entry XML invalid", e.getCause());
// fix <fields>/<field><name>/<filemask> structure or recreate in Spoon
throw e;
} Prevention
- Ensure each <field> has both <name> and <filemask> children
- Validate job XML before import
- Avoid hand-editing .kjb files
- Keep templates for generated XML up to date with schema
When it happens
Trigger: loadXML with a malformed entrynode, missing/broken <fields> structure, or XMLHandler throwing while fetching the field sub-nodes.
Common situations: Hand-edited .kjb where the fields block was truncated; job XML from another version with a different structure; copy-paste corruption; file truncation during transfer.
Related errors
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
- Error_0001
- ERROR_0001
- Error loading transformation executor details from XML
- GetXMLData.Log.UnableCreateDocument (localized message)
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/81213553049fd6a8.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/deletefiles/JobEntryDeleteFiles.java:154
Repository rep, IMetaStore metaStore ) throws KettleXMLException {
try {
super.loadXML( entrynode, databases, slaveServers );
argFromPrevious = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "arg_from_previous" ) );
includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );
Node fields = XMLHandler.getSubNode( entrynode, "fields" );
int numberOfFields = XMLHandler.countNodes( fields, "field" );
allocate( numberOfFields );
for ( int i = 0; i < numberOfFields; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i );
arguments[i] = XMLHandler.getTagValue( fnode, "name" );
filemasks[i] = XMLHandler.getTagValue( fnode, "filemask" );
}
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "JobEntryDeleteFiles.UnableToLoadFromXml" ), xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
argFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, "arg_from_previous" );
includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );
int numberOfArgs = rep.countNrJobEntryAttributes( id_jobentry, "name" );
allocate( numberOfArgs );
for ( int i = 0; i < numberOfArgs; i++ ) {
arguments[i] = rep.getJobEntryAttributeString( id_jobentry, i, "name" );
filemasks[i] = rep.getJobEntryAttributeString( id_jobentry, i, "filemask" );
}
} catch ( KettleException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "JobEntryDeleteFiles.UnableToLoadFromRepo", StringView on GitHub (pinned to f3058517a1)