{"record":{"id":"ad39ed276ccca20a","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-step-info-from-xml-salesforceupdatemeta","errorCode":null,"errorMessage":"Unable to load step info from XML","messagePattern":"Unable to load step info from XML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdateMeta.java","lineNumber":225,"sourceCode":"          updateStream[i] = updateLookup[i]; // default: the same name!\n        }\n        String updateValue = XMLHandler.getTagValue( fnode, \"useExternalId\" );\n        if ( updateValue == null ) {\n          // default FALSE\n          useExternalId[i] = Boolean.FALSE;\n        } else {\n          if ( updateValue.equalsIgnoreCase( \"Y\" ) ) {\n            useExternalId[i] = Boolean.TRUE;\n          } else {\n            useExternalId[i] = Boolean.FALSE;\n          }\n        }\n\n      }\n      setRollbackAllChangesOnError(\n        \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"rollbackAllChangesOnError\" ) ) );\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"Unable to load step info from XML\", e );\n    }\n  }\n\n  public void allocate( int nrvalues ) {\n    setUpdateLookup( new String[nrvalues] );\n    setUpdateStream( new String[nrvalues] );\n    setUseExternalId( new Boolean[nrvalues] );\n  }\n\n  public void setDefault() {\n    super.setDefault();\n    setBatchSize( \"10\" );\n\n    allocate( 0 );\n\n    setRollbackAllChangesOnError( false );\n  }\n","sourceCodeStart":207,"sourceCodeEnd":243,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforceupdate/SalesforceUpdateMeta.java#L207-L243","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Validate the Salesforce Update step XML block before loading\nfor (int i = 0; i < steps.getLength(); i++) {\n  Node n = steps.item(i);\n  if (XMLHandler.getTagValue(n, \"type\").equals(\"SalesforceUpdate\")\n      && XMLHandler.getTagValue(n, \"updateLookup\") == null) {\n    throw new IllegalArgumentException(\"SalesforceUpdate step XML is incomplete\");\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta = new TransMeta(ktrFile);\n} catch (KettleXMLException e) {\n  log.error(\"Failed to load Salesforce Update step XML, cause: {}\",\n    e.getCause() != null ? e.getCause().getMessage() : e.getMessage(), e);\n  throw e;\n}","preventionTips":["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."],"tags":["kettle","xml-parsing","step-metadata","salesforce"],"backgroundTag":"xml-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}