pentaho/pentaho-kettle · error · KettleXMLException
Unable to load 'job' job entry from XML node
Error message
Unable to load 'job' job entry from XML node
What it means
Thrown by JobEntryJob.loadXML when parsing the 'Job' job entry's XML node (including the parameters block with name/stream_name/value tags) fails with a KettleXMLException. The cause is chained. It means the nested Job entry could not be loaded from a .kjb XML document. This path is exercised by JobEntryJobTest's load tests (testNotConnectedLoad_*, testConnectedImport_*).
Solutions
- Validate and repair the XML of the Job entry node, especially the <parameters> block.
- Check the chained KettleXMLException message for the exact parse error location.
- Re-export the job from Spoon to regenerate well-formed XML.
- If migrating between Pentaho versions, re-create the Job entry in the target version's Spoon.
Example fix
// before: malformed parameter node <parameters><name>PARAM1</name><stream_name>field1</parameters> // after <parameters> <name>PARAM1</name> <stream_name>field1</stream_name> <value>abc</value> </parameters>
Defensive patterns
Strategy: validation
Validate before calling
Document doc = XMLHandler.loadXMLFile(inputStream);
if (doc == null) throw new KettleException("Not valid .kjb XML");
Node entry = XMLHandler.getSubNode(doc, "entry");
if (entry == null) throw new KettleException("No <entry> node found for Job entry");
if (XMLHandler.getSubNode(entry, "parameters") == null) logBasic("Job entry has no parameters block"); Try / catch
try {
entry.loadXML(entryNode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
logError("Job entry XML load failed: " + e.getMessage());
// repair parameters block or re-export the job
} Prevention
- Keep parameter sub-nodes (<name>/<stream_name>/<value>) well-formed.
- Do not hand-edit .kjb files; use Spoon.
- Validate job XML after scripted transformations.
- Re-create Job entries when moving across Pentaho versions.
When it happens
Trigger: Calling loadXML on JobEntryJob when XMLHandler navigation over the entry node (jobname, directory, filename, parameters sub-nodes) throws KettleXMLException — malformed XML or unexpected node structure in the .kjb file.
Common situations: Hand-edited or truncated .kjb files; parameter sub-nodes (<name>, <stream_name>, <value>) malformed after manual editing; version drift in the XML schema; encoding corruption after editing on another platform.
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
- JobEntryDeleteResultFilenames.CanNotLoadFromXML
- JobEntrySimple.Error.Exception.UnableLoadXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/efce557bb1d2114c.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/job/JobEntryJob.java:472
}
Node parametersNode = XMLHandler.getSubNode( entrynode, "parameters" );
String passAll = XMLHandler.getTagValue( parametersNode, "pass_all_parameters" );
passingAllParameters = Utils.isEmpty( passAll ) || "Y".equalsIgnoreCase( passAll );
int nrParameters = XMLHandler.countNodes( parametersNode, "parameter" );
allocateParams( nrParameters );
for ( int i = 0; i < nrParameters; i++ ) {
Node knode = XMLHandler.getSubNodeByNr( parametersNode, "parameter", i );
parameters[i] = XMLHandler.getTagValue( knode, "name" );
parameterFieldNames[i] = XMLHandler.getTagValue( knode, "stream_name" );
parameterValues[i] = XMLHandler.getTagValue( knode, "value" );
}
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( "Unable to load 'job' job entry from XML node", xe );
}
}
/**
* Load the jobentry from repository
*/
@Override
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
String method = rep.getJobEntryAttributeString( id_jobentry, "specification_method" );
specificationMethod = ObjectLocationSpecificationMethod.getSpecificationMethodByCode( method );
String jobId = rep.getJobEntryAttributeString( id_jobentry, "job_object_id" );
jobObjectId = Utils.isEmpty( jobId ) ? null : new StringObjectId( jobId );
jobname = rep.getJobEntryAttributeString( id_jobentry, "name" );
directory = rep.getJobEntryAttributeString( id_jobentry, "dir_path" );
filename = rep.getJobEntryAttributeString( id_jobentry, "file_name" );
View on GitHub (pinned to f3058517a1)