pentaho/pentaho-kettle · error · KettleXMLException
Unable to read step information from XML
Error message
Unable to read step information from XML
What it means
SecretKeyGeneratorMeta.loadXML throws KettleXMLException with this message when any exception occurs while parsing the step's XML node via XMLHandler.getTagValue calls. It wraps the underlying parse failure so transformation deserialization fails fast with step context. It is a wrapper exception: the cause holds the real problem.
Solutions
- Inspect the wrapped cause (e.getCause()) of the KettleXMLException to find the real parse failure
- Open the .ktr in a text editor and verify the <secret_key_generator> step node contains all expected child tags
- Re-export or recreate the transformation step in Spoon rather than hand-editing XML
- Check Pentaho version compatibility: XML produced by a much older/newer Kettle version may lack tags; loadXML tolerates missing tags but not malformed nodes
Example fix
// before: hand-edited XML missing tags <step><name>gen</name></step> // after: complete node <step><name>gen</name><secretKeyFieldName>key</secretKeyFieldName><secretKeyLengthFieldName>len</secretKeyLengthFieldName><algorithmFieldName>alg</algorithmFieldName><outputKeyInBinary>N</outputKeyInBinary></step>
Defensive patterns
Strategy: try-catch
Validate before calling
// before loadXML
if (stepnode == null || !stepnode.hasChildNodes()) {
throw new IllegalArgumentException("Step node is empty or missing");
} Try / catch
try { meta.loadXML(node, ...); } catch (KettleXMLException e) { log.error("Step XML invalid: " + e.getCause(), e); } Prevention
- Never hand-edit .ktr XML; use Spoon
- Keep Pentaho versions consistent across environments
- Validate exports against the Kettle XSD before loading
When it happens
Trigger: Calling loadXML(Node stepnode) on XML that is malformed, missing expected tags (secretKeyFieldName, secretKeyLengthFieldName, algorithmFieldName, outputKeyInBinary), or whose node is null/empty so XMLHandler throws.
Common situations: Opening a .ktr file edited by hand or by a different Pentaho/Kettle version; truncated XML export; a step node copied from another step type; corrupted repository-to-XML export.
Related errors
- CubeOutputMeta.Exception.UnableToLoadStepInfo
- DelayMeta.Exception.UnableToReadStepInfo
- PGPDecryptStreamMeta.Exception.UnableToReadStepInfo
- RulesMeta.Error.LoadFromXML
- RulesMeta.Error.LoadFromXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/db27e135a3575026.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/symmetriccrypto/secretkeygenerator/SecretKeyGeneratorMeta.java:249
allocate( count );
for ( int i = 0; i < count; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i );
algorithm[i] = XMLHandler.getTagValue( fnode, "algorithm" );
scheme[i] = XMLHandler.getTagValue( fnode, "scheme" );
secretKeyLength[i] = XMLHandler.getTagValue( fnode, "secretKeyLen" );
secretKeyCount[i] = XMLHandler.getTagValue( fnode, "secretKeyCount" );
}
secretKeyFieldName = XMLHandler.getTagValue( stepnode, "secretKeyFieldName" );
secretKeyLengthFieldName = XMLHandler.getTagValue( stepnode, "secretKeyLengthFieldName" );
algorithmFieldName = XMLHandler.getTagValue( stepnode, "algorithmFieldName" );
outputKeyInBinary = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "outputKeyInBinary" ) );
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to read step information from XML", e );
}
}
@Override
public void setDefault() {
int count = 0;
allocate( count );
for ( int i = 0; i < count; i++ ) {
algorithm[i] = "field" + i;
scheme[i] = "";
secretKeyLength[i] = "";
secretKeyCount[i] = "";
}
secretKeyFieldName = BaseMessages.getString( PKG, "SecretKeyGeneratorMeta.secretKeyField" );
secretKeyLengthFieldName = BaseMessages.getString( PKG, "SecretKeyGeneratorMeta.secretKeyLengthField" );
algorithmFieldName = BaseMessages.getString( PKG, "SecretKeyGeneratorMeta.algorithmField" );View on GitHub (pinned to f3058517a1)