pentaho/pentaho-kettle · error · KettleXMLException
Unable to load step info from XML
Error message
Unable to load step info from XML
What it means
SalesforceUpdateMeta.readData() parses the step's XML node during loadXML; any exception in that block is rethrown as KettleXMLException('Unable to load step info from XML') with the original cause chained. Identical family to error 3740 but for the Salesforce Update step: the step definition in the .ktr file could not be deserialized.
Solutions
- Inspect e.getCause() on the KettleXMLException for the precise parse failure.
- Open the .ktr, find the salesforce-update <step> block, and repair or delete/re-add the step in Spoon.
- Ensure the PDI version loading the file matches (or is newer than) the version that saved it, with the Salesforce plugin installed.
- Avoid manual XML edits; use Spoon's export/copy features to move steps.
Defensive patterns
Strategy: try-catch
Validate before calling
// Validate the Salesforce Update step XML block before loading
for (int i = 0; i < steps.getLength(); i++) {
Node n = steps.item(i);
if (XMLHandler.getTagValue(n, "type").equals("SalesforceUpdate")
&& XMLHandler.getTagValue(n, "updateLookup") == null) {
throw new IllegalArgumentException("SalesforceUpdate step XML is incomplete");
}
} Try / catch
try {
transMeta = new TransMeta(ktrFile);
} catch (KettleXMLException e) {
log.error("Failed to load Salesforce Update step XML, cause: {}",
e.getCause() != null ? e.getCause().getMessage() : e.getMessage(), e);
throw e;
} Prevention
- Edit Salesforce Update steps only through Spoon, not raw XML.
- Resolve .ktr merge conflicts by re-exporting from Spoon, not by hand-merging.
- Keep the Salesforce plugin installed and version-matched across PDI environments.
- Always surface e.getCause() when catching KettleXMLException.
When it happens
Trigger: Loading a .ktr containing a Salesforce Update step whose XML block is malformed, has unexpected tag content (e.g. non-boolean rollbackAllChangesOnError path is fine, but missing parent tags or corrupt XML cause XMLHandler to throw), or was produced by an incompatible PDI version.
Common situations: Hand-edited transformations; merge conflicts in .ktr files resolved incorrectly; copying step XML between transformations with missing sub-elements; plugin version mismatch between authoring and executing PDI installs.
Related errors
- Unable to load step info from XML
- MergeJoinMeta.Exception.UnableToLoadStepInfo
- MergeRowsMeta.Exception.UnableToLoadStepInfo
- AccessInputMeta.Exception.ErrorReadingRepository
- AggregateRowsMeta.Exception.UnexpectedErrorWhileReadingStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ad39ed276ccca20a.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdateMeta.java:225
updateStream[i] = updateLookup[i]; // default: the same name!
}
String updateValue = XMLHandler.getTagValue( fnode, "useExternalId" );
if ( updateValue == null ) {
// default FALSE
useExternalId[i] = Boolean.FALSE;
} else {
if ( updateValue.equalsIgnoreCase( "Y" ) ) {
useExternalId[i] = Boolean.TRUE;
} else {
useExternalId[i] = Boolean.FALSE;
}
}
}
setRollbackAllChangesOnError(
"Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "rollbackAllChangesOnError" ) ) );
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to load step info from XML", e );
}
}
public void allocate( int nrvalues ) {
setUpdateLookup( new String[nrvalues] );
setUpdateStream( new String[nrvalues] );
setUseExternalId( new Boolean[nrvalues] );
}
public void setDefault() {
super.setDefault();
setBatchSize( "10" );
allocate( 0 );
setRollbackAllChangesOnError( false );
}
View on GitHub (pinned to f3058517a1)