pentaho/pentaho-kettle · error · KettleXMLException

StreamLookupMeta.Exception.UnableToLoadStepInfoFromXML

Error message

StreamLookupMeta.Exception.UnableToLoadStepInfoFromXML

What it means

StreamLookupMeta.readData parses the step's XML node and, if any exception occurs while reading key/value/default configuration, wraps it in KettleXMLException 'Unable to load step info from XML'. This is a deserialization failure for the step's saved metadata in a .ktr file.

Solutions

  1. Open the .ktr in a text editor and verify each <field> node has well-formed <name>, <key_lookup>/<stream_name1>, <value>, <default> and valid <type> tags
  2. Correct or remove the malformed field entry causing the parse failure
  3. Re-export the transformation from a PDI version compatible with the one loading it
  4. Restore the .ktr from version control if it was corrupted by a merge

Example fix

// before
<type>NUMBRE</type>  <!-- typo -->
// after
<type>Number</type>
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate ktr XML against expected tags before loading
String type = XMLHandler.getTagValue(fieldNode, "type");
if (type == null || ValueMetaFactory.getIdForValueMeta(type) < 0)
  throw new IllegalArgumentException("Invalid <type> in StreamLookup field XML: " + type);

Type guard

boolean isParsableFieldType(String dtype) {
  try { ValueMetaFactory.getIdForValueMeta(dtype); return true; } catch (Exception e) { return false; }
}

Try / catch

try { meta.loadXML(node, databases, metaStore); }
catch (KettleXMLException e) {
  log.error("Corrupt StreamLookup step XML: " + e.getMessage(), e);
  throw new IllegalStateException("Fix the .ktr step definition", e);
}

Prevention

When it happens

Trigger: loadXML -> readData throws when XMLHandler.getTagValue returns unexpected content or ValueMetaFactory.getIdForValueMeta(dtype) fails for an unknown/missing <type> tag value.

Common situations: Hand-edited or truncated .ktr files; transformations exported from newer PDI versions using value types unknown to an older version; corrupted XML after a bad merge or version-control conflict.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/715c29b0bf234dd1. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/streamlookup/StreamLookupMeta.java:190

        // CHECKSTYLE:Indentation:ON
      }

      for ( int i = 0; i < nrvalues; i++ ) {
        Node vnode = XMLHandler.getSubNodeByNr( lookup, "value", i );
        // CHECKSTYLE:Indentation:OFF
        getValue()[i] = XMLHandler.getTagValue( vnode, "name" );
        getValueName()[i] = XMLHandler.getTagValue( vnode, "rename" );
        if ( getValueName()[i] == null ) {
          getValueName()[i] = getValue()[i]; // default: same name to return!
        }

        getValueDefault()[i] = XMLHandler.getTagValue( vnode, "default" );
        dtype = XMLHandler.getTagValue( vnode, "type" );
        getValueDefaultType()[i] = ValueMetaFactory.getIdForValueMeta( dtype );
        // CHECKSTYLE:Indentation:ON
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "StreamLookupMeta.Exception.UnableToLoadStepInfoFromXML" ), e );
    }
  }

  @Override
  public void searchInfoAndTargetSteps( List<StepMeta> steps ) {
    List<StreamInterface> infoStreams = getStepIOMeta().getInfoStreams();
    for ( StreamInterface stream : infoStreams ) {
      stream.setStepMeta( StepMeta.findStep( steps, (String) stream.getSubject() ) );
    }
  }

  @Override
  public void setDefault() {
    setMemoryPreservationActive( true );
    setUsingSortedList( false );
    setUsingIntegerPair( false );

View on GitHub (pinned to f3058517a1)