{"record":{"id":"06d17747af721ec5","repo":"pentaho/pentaho-kettle","slug":"multimergejoinmeta-exception-unabletoloadstepinfo","errorCode":"MultiMergeJoinMeta.Exception.UnableToLoadStepInfo","errorMessage":"MultiMergeJoinMeta.Exception.UnableToLoadStepInfo","messagePattern":"MultiMergeJoinMeta\\.Exception\\.UnableToLoadStepInfo","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/multimerge/MultiMergeJoinMeta.java","lineNumber":184,"sourceCode":"\n      allocateKeys( nrKeys );\n\n      for ( int i = 0; i < nrKeys; i++ ) {\n        Node keynode = XMLHandler.getSubNodeByNr( keysNode, \"key\", i );\n        keyFields[i] = XMLHandler.getNodeValue( keynode );\n      }\n\n      int nInputStreams = Integer.parseInt( XMLHandler.getTagValue( stepnode, \"number_input\" ) );\n\n      allocateInputSteps( nInputStreams );\n\n      for ( int i = 0; i < nInputStreams; i++ ) {\n        inputSteps[i] = XMLHandler.getTagValue( stepnode, \"step\" + i );\n      }\n\n      joinType = XMLHandler.getTagValue( stepnode, \"join_type\" );\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"MultiMergeJoinMeta.Exception.UnableToLoadStepInfo\" ),\n          e );\n    }\n  }\n\n  @Override\n  public void setDefault() {\n    joinType = join_types[0];\n    allocateKeys( 0 );\n    allocateInputSteps( 0 );\n  }\n\n  @Override\n  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases )\n    throws KettleException {\n    try {\n      int nrKeys = rep.countNrStepAttributes( id_step, \"keys\" );\n\n      allocateKeys( nrKeys );","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/multimerge/MultiMergeJoinMeta.java#L166-L202","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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."],"exampleFix":"// before (malformed step XML)\n<step0>Input A<step0>\n<join_type>INNER\n\n// after (well-formed)\n<step0>Input A</step0>\n<join_type>INNER</join_type>","handlingStrategy":"try-catch","validationCode":"// Validate the .ktr XML is well-formed before loading\nDocumentBuilderFactory f = DocumentBuilderFactory.newInstance();\nf.newDocumentBuilder().parse( new File( ktrPath ) ); // throws SAXException on malformed XML","typeGuard":null,"tryCatchPattern":"try {\n  TransMeta tm = new TransMeta( ktrPath );\n} catch ( KettleXMLException e ) {\n  if ( e.getMessage().contains( \"UnableToLoadStepInfo\" ) ) {\n    // inspect e.getCause() for the XML parse error; repair or recreate the step\n  } else { throw e; }\n}","preventionTips":["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."],"tags":["kettle","xml","deserialization","metadata","step-meta"],"backgroundTag":"xml-parse-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}