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

  1. 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.
  2. Re-create the MultiMerge Join step in Spoon and re-enter its input steps and join type, then save a fresh file.
  3. Check the nested cause (KettleXMLException wraps it) to identify the exact parse error and line.
  4. 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

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


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)