pentaho/pentaho-kettle · error · KettleXMLException
JobExportRepository.Meta.UnableLoadXML
JobExportRepository.Meta.UnableLoadXML
Error message
JobExportRepository.Meta.UnableLoadXML
What it means
JobEntryExportRepository.loadXML wraps KettleXMLException raised while parsing the job entry's XML node with the localized message 'JobExportRepository.Meta.UnableLoadXML'. It means the job (.kjb) XML for this Export Repository entry could not be parsed.
Solutions
- Validate the <entry> XML block for this job entry in the .kjb file
- Recreate the job entry in Spoon to regenerate valid XML
- Compare against a working job file from the same PDI version
Defensive patterns
Strategy: try-catch
Validate before calling
// validate XML before loading job DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new File( kjbPath ) );
Try / catch
try { jobMeta.loadXml( file ); } catch ( KettleXMLException e ) { log.error( "Job entry XML corrupt: " + e.getCause(), e ); } Prevention
- Avoid manual edits to .kjb files
- Regenerate entries in Spoon when XML is suspect
- Match PDI versions between authoring and runtime
When it happens
Trigger: Loading a .kjb whose export-repository job entry node has malformed or missing tags (e.g. 'success_condition', 'nr_errors_less_than'), typically from version skew or manual edits.
Common situations: Hand-editing job files; opening jobs exported from a different PDI version; truncated/corrupt XML files.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
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/ea5da1c142d310e3.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/export-repository/impl/src/main/java/org/pentaho/di/job/entries/exportrepository/JobEntryExportRepository.java:196
repositoryname = XMLHandler.getTagValue( entrynode, "repositoryname" );
username = XMLHandler.getTagValue( entrynode, "username" );
password = Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, "password" ) );
targetfilename = XMLHandler.getTagValue( entrynode, "targetfilename" );
iffileexists = XMLHandler.getTagValue( entrynode, "iffileexists" );
export_type = XMLHandler.getTagValue( entrynode, "export_type" );
directoryPath = XMLHandler.getTagValue( entrynode, "directoryPath" );
add_date = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_date" ) );
add_time = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_time" ) );
SpecifyFormat = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "SpecifyFormat" ) );
date_time_format = XMLHandler.getTagValue( entrynode, "date_time_format" );
createfolder = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "createfolder" ) );
newfolder = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "newfolder" ) );
add_result_filesname = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_result_filesname" ) );
nr_errors_less_than = XMLHandler.getTagValue( entrynode, "nr_errors_less_than" );
success_condition = XMLHandler.getTagValue( entrynode, "success_condition" );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "JobExportRepository.Meta.UnableLoadXML" ), xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
repositoryname = rep.getJobEntryAttributeString( id_jobentry, "repositoryname" );
username = rep.getJobEntryAttributeString( id_jobentry, "username" );
password =
Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( id_jobentry, "password" ) );
targetfilename = rep.getJobEntryAttributeString( id_jobentry, "targetfilename" );
iffileexists = rep.getJobEntryAttributeString( id_jobentry, "iffileexists" );
export_type = rep.getJobEntryAttributeString( id_jobentry, "export_type" );
directoryPath = rep.getJobEntryAttributeString( id_jobentry, "directoryPath" );
add_date = rep.getJobEntryAttributeBoolean( id_jobentry, "add_date" );
add_time = rep.getJobEntryAttributeBoolean( id_jobentry, "add_time" );
SpecifyFormat = rep.getJobEntryAttributeBoolean( id_jobentry, "SpecifyFormat" );
date_time_format = rep.getJobEntryAttributeString( id_jobentry, "date_time_format" );View on GitHub (pinned to f3058517a1)