pentaho/pentaho-kettle · error · KettleXMLException

Error loading transformation executor details from XML

Error message

Error loading transformation executor details from XML

What it means

TransExecutorMeta.loadXML() wraps any exception while parsing the TransExecutor step's XML configuration (sub-transformation path/reference, execution result target fields, grouping settings) into a KettleXMLException. It means the .ktr XML for this step could not be read.

Solutions

  1. Inspect the .ktr XML for the TransExecutor step and repair malformed tags.
  2. Open the step in Spoon and reconfigure it to regenerate valid XML.
  3. Load with the Pentaho version that produced the file, or migrate via Spoon.
  4. Check the chained cause for the exact XMLHandler failure.
Defensive patterns

Strategy: validation

Try / catch

try { transMeta.loadXML(file, ...); }
catch (KettleXMLException e) {
  log.error("TransExecutor XML invalid: {}", e.getCause(), e);
}

Prevention

When it happens

Trigger: Loading a .ktr whose TransExecutor step XML is malformed or has values that fail parsing inside the try block covering XMLHandler.getTagValue calls (execution config, result field names, target step names).

Common situations: Hand-edited or corrupted .ktr files; transformations from incompatible Pentaho versions with changed XML tags; git merge conflicts in transformation files.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/transexecutor/TransExecutorMeta.java:378

      int nrFields = XMLHandler.countNodes( stepnode, "result_rows_field" );
      allocate( nrFields );

      for ( int i = 0; i < nrFields; i++ ) {

        Node fieldNode = XMLHandler.getSubNodeByNr( stepnode, "result_rows_field", i );

        outputRowsField[ i ] = XMLHandler.getTagValue( fieldNode, "name" );
        outputRowsType[ i ] = ValueMetaFactory.getIdForValueMeta( XMLHandler.getTagValue( fieldNode, "type" ) );
        outputRowsLength[ i ] = Const.toInt( XMLHandler.getTagValue( fieldNode, "length" ), -1 );
        outputRowsPrecision[ i ] = Const.toInt( XMLHandler.getTagValue( fieldNode, "precision" ), -1 );
      }

      resultFilesTargetStep = XMLHandler.getTagValue( stepnode, F_RESULT_FILE_TARGET_STEP );
      resultFilesFileNameField = XMLHandler.getTagValue( stepnode, "result_files_file_name_field" );
      executorsOutputStep = XMLHandler.getTagValue( stepnode, F_EXECUTOR_OUTPUT_STEP );
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString( PKG,
        "TransExecutorMeta.Exception.ErrorLoadingTransExecutorDetailsFromXML" ), e );
    }
  }

  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases )
    throws KettleException {
    String method = rep.getStepAttributeString( id_step, "specification_method" );
    specificationMethod = ObjectLocationSpecificationMethod.getSpecificationMethodByCode( method );
    String transId = rep.getStepAttributeString( id_step, "trans_object_id" );
    transObjectId = Utils.isEmpty( transId ) ? null : new StringObjectId( transId );
    transName = rep.getStepAttributeString( id_step, "trans_name" );
    fileName = rep.getStepAttributeString( id_step, "filename" );
    directoryPath = rep.getStepAttributeString( id_step, "directory_path" );

    groupSize = rep.getStepAttributeString( id_step, "group_size" );
    groupField = rep.getStepAttributeString( id_step, "group_field" );
    groupTime = rep.getStepAttributeString( id_step, "group_time" );

View on GitHub (pinned to f3058517a1)