pentaho/pentaho-kettle · error · KettleXMLException
MultiMergeJoinMeta.Exception.UnableToLoadStepInfo
MultiMergeJoinMeta.Exception.UnableToLoadStepInfo
Error message
MultiMergeJoinMeta.Exception.UnableToLoadStepInfo
What it means
Thrown by MultiMergeJoinMeta.readData (invoked from loadXML) when any exception occurs while parsing the step's XML definition, e.g. reading the per-input "step<i>" tags or the "join_type" tag via XMLHandler. It wraps the underlying exception in a KettleXMLException so the transformation file load reports which step failed to deserialize.
Solutions
- Open the .ktr in an XML editor and inspect the MultiMergeJoin <step> node for malformed or missing XML around the "step0", "step1", ... and "join_type" tags.
- Re-create the MultiMerge Join step in Spoon and re-enter its input steps and join type, then save a fresh file.
- Check the nested cause (KettleXMLException wraps it) to identify the exact parse error and line.
- Verify the transformation loads in the same PDI version that produced it; upgrade or align versions if the XML schema differs.
Example fix
// before (malformed step XML) <step0>Input A<step0> <join_type>INNER // after (well-formed) <step0>Input A</step0> <join_type>INNER</join_type>
Defensive patterns
Strategy: try-catch
Validate before calling
// Validate the .ktr XML is well-formed before loading DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.newDocumentBuilder().parse( new File( ktrPath ) ); // throws SAXException on malformed XML
Try / catch
try {
TransMeta tm = new TransMeta( ktrPath );
} catch ( KettleXMLException e ) {
if ( e.getMessage().contains( "UnableToLoadStepInfo" ) ) {
// inspect e.getCause() for the XML parse error; repair or recreate the step
} else { throw e; }
} Prevention
- Never hand-edit .ktr XML; edit steps through Spoon.
- Keep producer and consumer PDI versions aligned.
- Keep files under version control so corrupted edits can be reverted.
- Validate XML well-formedness after any scripted transformation-file manipulation.
When it happens
Trigger: Loading a .ktr file whose <step> node for MultiMergeJoin contains malformed XML, an unexpectedly structured node, or an XMLHandler.getTagValue call that throws (e.g. corrupted or hand-edited XML, incompatible document structure from a different PDI version).
Common situations: A .ktr file was hand-edited or truncated; the file was produced by a newer PDI version whose XML layout differs; repository/file corruption; copy-pasting step XML between transformations with broken nesting.
Related errors
- GetTableNamesMeta.Exception.UnableToReadStepInfo
- GPBulkLoaderMeta.Exception.UnableToReadStepInfoFromXML
- GPLoadMeta.Exception.UnableToReadStepInfoFromXML
- MappingMeta.Exception.ErrorLoadingTransformationStepFromXML
- NormaliserMeta.Exception.UnableToLoadStepInfoFromXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/06d17747af721ec5.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/multimerge/MultiMergeJoinMeta.java:184
allocateKeys( nrKeys );
for ( int i = 0; i < nrKeys; i++ ) {
Node keynode = XMLHandler.getSubNodeByNr( keysNode, "key", i );
keyFields[i] = XMLHandler.getNodeValue( keynode );
}
int nInputStreams = Integer.parseInt( XMLHandler.getTagValue( stepnode, "number_input" ) );
allocateInputSteps( nInputStreams );
for ( int i = 0; i < nInputStreams; i++ ) {
inputSteps[i] = XMLHandler.getTagValue( stepnode, "step" + i );
}
joinType = XMLHandler.getTagValue( stepnode, "join_type" );
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "MultiMergeJoinMeta.Exception.UnableToLoadStepInfo" ),
e );
}
}
@Override
public void setDefault() {
joinType = join_types[0];
allocateKeys( 0 );
allocateInputSteps( 0 );
}
@Override
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases )
throws KettleException {
try {
int nrKeys = rep.countNrStepAttributes( id_step, "keys" );
allocateKeys( nrKeys );View on GitHub (pinned to f3058517a1)