pentaho/pentaho-kettle · error · KettleXMLException
JobMeta.Exception.UnableToLoadJobFromXMLNode
Error message
JobMeta.Exception.UnableToLoadJobFromXMLNode
What it means
JobMeta.loadXML(Node jobnode, ...) throws this KettleXMLException when any exception occurs while populating a JobMeta from an already-obtained XML DOM node: bad sub-elements, failing AttributesUtil.loadAttributes, or a throwing JobMetaLoaded extension point. Unlike error 730 the failure is in interpreting the node, not reading the file, and the original exception is chained.
Solutions
- Confirm the Node passed in is the <job> root element, not a parent document or sibling node
- Read the chained cause to find which element/extension point failed
- Disable or fix any JobMetaLoaded extension point plugins and retry
- Repair or re-export the job XML so all required sub-nodes (entries, hops, attributes) are present
Example fix
// before Node jobNode = XMLHandler.getSubNode(doc, "wrong-tag"); jobMeta.loadXML(jobNode, null, null, metaStore, null, null); // after Node jobNode = XMLHandler.getSubNode(doc, XMLHandler.XML_TAG_JOB); // ensure the real <job> node jobMeta.loadXML(jobNode, null, null, metaStore, null, null);
Defensive patterns
Strategy: try-catch
Validate before calling
Node jobNode = XMLHandler.getSubNode(doc, "job");
if (jobNode == null) throw new IllegalArgumentException("XML document has no <job> root node"); Try / catch
try {
jobMeta.loadXML(jobnode, fname, rep, metaStore, prompter, null);
} catch (KettleXMLException e) {
log.error("Job node could not be loaded: " + e.getCause(), e);
} Prevention
- Always pass the exact <job> element, never the Document node
- Audit JobMetaLoaded extension-point plugins for throwing code paths
- Re-export jobs from Spoon rather than hand-editing XML
When it happens
Trigger: Calling JobMeta.loadXML(Node jobnode, ...) with a node that is not a valid <job> element or whose children fail to parse; an extension point registered on KettleExtensionPoint.JobMetaLoaded throws; AttributesUtil.loadAttributes encounters malformed attributes XML.
Common situations: Parsing a job from an embedded XML string where the wrong sub-node was selected; a plugin's extension point crashing during job load; hand-built or edited job XML missing required child elements (job entries, hops, attributes map).
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
- JobMeta.Exception.UnableToLoadJobFromXMLFile
- AddSequenceMeta.Exception.ErrorLoadingStepInfo
- AggregateRowsMeta.Exception.UnableToLoadStepInfo
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
- AppendMeta.Exception.UnableToLoadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/2fc5fe3ae4ab121f.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/JobMeta.java:1340
// Read the notes...
Node notepadsnode = XMLHandler.getSubNode( jobnode, "notepads" );
int nrnotes = XMLHandler.countNodes( notepadsnode, "notepad" );
for ( int i = 0; i < nrnotes; i++ ) {
Node notepadnode = XMLHandler.getSubNodeByNr( notepadsnode, "notepad", i );
NotePadMeta ni = new NotePadMeta( notepadnode );
notes.add( ni );
}
// Load the attribute groups map
//
attributesMap = AttributesUtil.loadAttributes( XMLHandler.getSubNode( jobnode, AttributesUtil.XML_TAG ) );
ExtensionPointHandler.callExtensionPoint( LogChannel.GENERAL, KettleExtensionPoint.JobMetaLoaded.id, this );
clearChanged();
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "JobMeta.Exception.UnableToLoadJobFromXMLNode" ), e );
} finally {
setInternalKettleVariables();
}
}
/**
* Gets the job entry copy.
*
* @param x the x
* @param y the y
* @param iconsize the iconsize
* @return the job entry copy
*/
public JobEntryCopy getJobEntryCopy( int x, int y, int iconsize ) {
int i, s;
s = nrJobEntries();
for ( i = s - 1; i >= 0; i-- ) {
// Back to front because drawing goes from start to endView on GitHub (pinned to f3058517a1)