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
- Inspect the .ktr XML for the TransExecutor step and repair malformed tags.
- Open the step in Spoon and reconfigure it to regenerate valid XML.
- Load with the Pentaho version that produced the file, or migrate via Spoon.
- 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
- Edit TransExecutor steps only via Spoon
- Validate .ktr XML after manual merges
- Keep Pentaho versions consistent across environments
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
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
- Error_0001
- ERROR_0001
- GetXMLData.Log.UnableCreateDocument (localized message)
- It was not possibke to load the Trim metadata from XML
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)