pentaho/pentaho-kettle · error · KettleXMLException
CombinationLookupMeta.Exception.UnableToLoadStepInfo
Error message
CombinationLookupMeta.Exception.UnableToLoadStepInfo
What it means
KettleXMLException thrown by CombinationLookupMeta.readData when parsing the <step> XML node for a CombinationLookup fails for any reason. It wraps the original exception with the localized message 'Unable to load step info from XML layer', indicating the saved step definition in the .ktr file could not be deserialized.
Solutions
- Open the .ktr file and inspect the <combination_lookup> XML block for malformed/missing tags; fix or remove the broken step.
- Re-add the CombinationLookup step in Spoon and reconfigure it, then save a fresh copy.
- Open the transformation in the PDI version it was created with (check version mismatch).
- Keep a backup of the .ktr before manual edits.
Example fix
// before (broken ktr fragment): // <returnvalue><name>customer_tk</name></returnvalue> <!-- missing use_autoinc attr etc. --> // after: // <returnvalue><name>customer_tk</name><use_autoinc>Y</use_autoinc></returnvalue> // plus all expected tags (last_update_field, creation_method, ...).
Defensive patterns
Strategy: try-catch
Validate before calling
// validate ktr XML before load: check required tags exist
// if (XMLHandler.getTagValue(stepnode, "connection") == null)
// throw new KettleXMLException("Step XML missing required tags"); Try / catch
try {
transMeta.loadXML(file, null, null, null, null, true, observer);
} catch (KettleXMLException e) {
log.error("Failed to parse CombinationLookup step XML: " + e.getCause(), e);
} Prevention
- Never hand-edit ktr files without a backup and XML validation.
- Match PDI versions between designers and runtime.
- Validate ktr files after merges or version-control conflicts.
- Re-add misconfigured steps in the UI rather than patching XML.
When it happens
Trigger: loadXML -> readData encounters malformed or missing XML tags (e.g. corrupted retkey node, missing 'name'/'use_autoinc' attributes) or any exception while reading tags like last_update_field or creation_method.
Common situations: Hand-edited or truncated .ktr files; transformations from newer PDI versions opened in older versions; XML encoding corruption; missing required tags after manual merge of step definitions.
Understand the failure class
Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.
Related errors
- AddSequenceMeta.Exception.ErrorLoadingStepInfo
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
- AppendMeta.Exception.UnableToLoadStepInfo
- ChangeFileEncodingMeta.Exception.UnableToReadStepInfo
- Error loading transformation step from XML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/5f7ff5b7c17efb9c.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/combinationlookup/CombinationLookupMeta.java:447
// Read keys to dimension
for ( int i = 0; i < nrkeys; i++ ) {
Node knode = XMLHandler.getSubNodeByNr( keys, "key", i );
keyField[ i ] = XMLHandler.getTagValue( knode, "name" );
keyLookup[ i ] = XMLHandler.getTagValue( knode, "lookup" );
}
// If this is empty: use auto-increment field!
sequenceFrom = XMLHandler.getTagValue( stepnode, "sequence" );
Node fields = XMLHandler.getSubNode( stepnode, "fields" );
Node retkey = XMLHandler.getSubNode( fields, "return" );
technicalKeyField = XMLHandler.getTagValue( retkey, "name" );
useAutoinc = !"N".equalsIgnoreCase( XMLHandler.getTagValue( retkey, "use_autoinc" ) );
lastUpdateField = XMLHandler.getTagValue( stepnode, "last_update_field" );
setTechKeyCreation( XMLHandler.getTagValue( retkey, "creation_method" ) );
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "CombinationLookupMeta.Exception.UnableToLoadStepInfo" ), e );
}
}
@Override
public void setDefault() {
schemaName = "";
tablename = BaseMessages.getString( PKG, "CombinationLookupMeta.DimensionTableName.Label" );
databaseMeta = null;
commitSize = 100;
cacheSize = DEFAULT_CACHE_SIZE;
replaceFields = false;
preloadCache = false;
useHash = false;
hashField = "hashcode";
int nrkeys = 0;
allocate( nrkeys );View on GitHub (pinned to f3058517a1)