pentaho/pentaho-kettle · error · KettleXMLException

DimensionLookupMeta.Exception.UnableToLoadStepInfoFromXML

Error message

DimensionLookupMeta.Exception.UnableToLoadStepInfoFromXML

What it means

loadXML() deserializes the step's configuration from the transformation XML (stepnode) using XMLHandler tag reads. If any of those reads or subsequent parsing throws, the whole block is caught and rethrown as a KettleXMLException with the localized 'Unable to load step info from XML' message. It indicates the step's XML representation is malformed or contains values the current code cannot parse.

Solutions

  1. Open the .ktr in Spoon and re-save the step to regenerate valid XML
  2. Inspect the wrapped cause (getCause()) to find the exact tag/value that failed to parse
  3. Compare the step XML block against a working Dimension Lookup step's XML and fix or remove invalid tags (especially start_date_alternative)
  4. Align the file with the Kettle version that will run it, or upgrade the Pentaho/Kettle engine
  5. Restore the transformation from backup if the XML was hand-edited or truncated

Example fix

// before: hand-edited XML with unknown alternative value
<start_date_alternative>tomorrow</start_date_alternative>
// after
<start_date_alternative>system_date</start_date_alternative>
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: sanity-check the step XML before loading
org.w3c.dom.Node stepnode = XMLHandler.getSubNode(transNode, "step");
if (XMLHandler.getTagValue(stepnode, "start_date_alternative") == null
    && "Y".equalsIgnoreCase(XMLHandler.getTagValue(stepnode, "use_start_date_alternative"))) {
  throw new IllegalArgumentException("use_start_date_alternative set but start_date_alternative missing");
}

Try / catch

try {
  meta.loadXML(stepnode, databases, metaStore);
} catch (KettleXMLException e) {
  if (e.getMessage().contains("UnableToLoadStepInfoFromXML")) {
    logError("Bad DimensionLookup XML: " + e.getCause());
    // re-create the step in Spoon or fix/remove the offending tag
  } else throw e;
}

Prevention

When it happens

Trigger: Any exception while reading tags such as key_field, table_name, fields, use_start_date_alternative, start_date_alternative, or start_date_field_name from the step node — e.g. getStartDateAlternative cannot map an unknown string to its enum constant.

Common situations: Transformations authored by newer/older Kettle versions with changed tag names or values; hand-edited or truncated .ktr files; copy-pasted step XML missing required tags; an unrecognized start_date_alternative value.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/b9dbef5b95de3efd. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/dimensionlookup/DimensionLookupMeta.java:959

      minYear = Const.toInt( XMLHandler.getTagValue( stepnode, "min_year" ), Const.MIN_YEAR );

      keyField = XMLHandler.getTagValue( fields, "return", "name" );
      keyRename = XMLHandler.getTagValue( fields, "return", "rename" );
      autoIncrement = !"N".equalsIgnoreCase( XMLHandler.getTagValue( fields, "return", "use_autoinc" ) );
      versionField = XMLHandler.getTagValue( fields, "return", "version" );

      setTechKeyCreation( XMLHandler.getTagValue( fields, "return", "creation_method" ) );

      cacheSize = Const.toInt( XMLHandler.getTagValue( stepnode, "cache_size" ), -1 );
      preloadingCache = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "preload_cache" ) );
      useBatchUpdate = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "useBatch" ) );

      usingStartDateAlternative =
          "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "use_start_date_alternative" ) );
      startDateAlternative = getStartDateAlternative( XMLHandler.getTagValue( stepnode, "start_date_alternative" ) );
      startDateFieldName = XMLHandler.getTagValue( stepnode, "start_date_field_name" );
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString( PKG,
          "DimensionLookupMeta.Exception.UnableToLoadStepInfoFromXML" ), e );
    }
  }

  @Override
  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases )
    throws KettleException {
    try {
      this.databases = databases;
      databaseMeta = rep.loadDatabaseMetaFromStepAttribute( id_step, "id_connection", databases );

      schemaName = rep.getStepAttributeString( id_step, "schema" );
      tableName = rep.getStepAttributeString( id_step, "table" );
      commitSize = (int) rep.getStepAttributeInteger( id_step, "commit" );
      update = rep.getStepAttributeBoolean( id_step, "update" );

      int nrkeys = rep.countNrStepAttributes( id_step, "lookup_key_name" );
      int nrfields = rep.countNrStepAttributes( id_step, "field_update" );

View on GitHub (pinned to f3058517a1)