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
- 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
- Correct or remove the malformed field entry causing the parse failure
- Re-export the transformation from a PDI version compatible with the one loading it
- 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
- Do not hand-edit .ktr files without validating XML afterwards
- Keep PDI versions consistent between designers and runtime (Kitchen/Carte)
- Commit .ktr files as text and resolve merge conflicts carefully
- Back up transformations before migrating between PDI versions
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
- ColumnExistsMeta.Exception.UnableToReadStepInfo
- CreditCardValidatorMeta.Exception.UnableToReadStepInfo
- ScriptMeta.Exception.UnableToLoadStepInfoFromXML
- SETVARIABLE0004
- SymmetricCryptoTransMeta.Exception.UnableToLoadStepInfoFromXML
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)