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

  1. Inspect e.getCause() on the KettleXMLException for the precise parse failure.
  2. Open the .ktr, find the salesforce-update <step> block, and repair or delete/re-add the step in Spoon.
  3. Ensure the PDI version loading the file matches (or is newer than) the version that saved it, with the Salesforce plugin installed.
  4. 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

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


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)