pentaho/pentaho-kettle · error · KettleXMLException
JobEntryAddResultFilenames.UnableToLoadFromXml
Error message
JobEntryAddResultFilenames.UnableToLoadFromXml
What it means
JobEntryAddResultFilenames.loadXML throws KettleXMLException wrapping this message when parsing the job entry's XML <fields> section fails. The library throws it to preserve the cause while reporting that this specific job entry could not be deserialized from a .kjb file.
Solutions
- Open the .kjb file in Spoon and fix or delete the AddResultFilenames entry that fails to load.
- Validate the XML is well-formed (xmllint) and that each <field> node has <name> and <filemask> children.
- Recreate the job entry in the designer so it serializes fresh XML.
Example fix
// before Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i ); // fields may be null // after Node fields = XMLHandler.getSubNode( entrynode, "fields" ); int nrFields = fields != null ? XMLHandler.countNodes( fields, "field" ) : 0;
Defensive patterns
Strategy: try-catch
Validate before calling
// pre-validate XML before loadXML
Document doc = XMLHandler.loadXMLFile( new File( kjbPath ) );
Node fields = XMLHandler.getSubNode( XMLHandler.getSubNode( doc, "entry" ), "fields" );
if ( fields == null || XMLHandler.countNodes( fields, "field" ) == 0 ) { throw new IllegalStateException( "no <field> nodes" ); } Type guard
boolean isValidFieldsNode(Node n) { return n != null && XMLHandler.countNodes( n, "field" ) > 0; } Try / catch
try { entry.loadXML( entrynode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( "AddResultFilenames XML invalid: " + e.getMessage(), e ); /* fall back to defaults or re-create entry */ } Prevention
- Never hand-edit .kjb XML; edit via Spoon.
- Resolve VCS merges on job files by regenerating from the designer.
- Keep PDI designer and runtime versions aligned.
When it happens
Trigger: Calling loadXML with a malformed or unexpected XML node: a missing/corrupt <field> subnode, or XMLHandler.getTagValue returning data that breaks parsing (e.g. truncated file, wrong element nesting).
Common situations: Hand-edited or partially written .kjb files, files generated by newer Pentaho versions loaded in an older one, or corrupted XML during version control merges.
Related errors
- JobEntryAbort.UnableToLoadFromXml.Label
- JobEntryCheckFilesLocked.UnableToLoadFromXml
- JobEntryColumnsExist.Meta.UnableLoadXml
- JobEntryConnectedToRepository.Meta.UnableToLoadFromXML
- JobEntryEval.UnableToLoadFromXml
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/e91d77f649c119f4.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/job/entries/addresultfilenames/JobEntryAddResultFilenames.java:147
includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );
deleteallbefore = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "delete_all_before" ) );
Node fields = XMLHandler.getSubNode( entrynode, "fields" );
// How many field arguments?
int nrFields = XMLHandler.countNodes( fields, "field" );
arguments = new String[nrFields];
filemasks = new String[nrFields];
// Read them all...
for ( int i = 0; i < nrFields; 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, "JobEntryAddResultFilenames.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" );
deleteallbefore = rep.getJobEntryAttributeBoolean( id_jobentry, "delete_all_before" );
// How many arguments?
int argnr = rep.countNrJobEntryAttributes( id_jobentry, "name" );
arguments = new String[argnr];
filemasks = new String[argnr];
// Read them all...View on GitHub (pinned to f3058517a1)