pentaho/pentaho-kettle · error · KettleXMLException
Unable to load step info from XML
Error message
Unable to load step info from XML
What it means
KettleXMLException thrown by PrioritizeStreamsMeta.readData (via loadXML) when parsing the step's XML fails. It reads the <steps> node and each <step> sub-node to get the names of the streams to prioritize; any exception during that is wrapped with this generic message. It indicates malformed or incompatible XML for this step.
Solutions
- Validate the .ktr XML around the Prioritize Streams step node, ensuring <steps><step><name>... structure is intact.
- Recreate/re-save the step in Spoon to regenerate valid XML.
- Re-export the transformation from the original PDI version if a version mismatch is suspected.
Example fix
// before: missing <steps> wrapper <step><type>PrioritizeStreams</type></step> // after <step><type>PrioritizeStreams</type><fields><steps><step><name>Input A</name></step></steps></fields></step>
Defensive patterns
Strategy: try-catch
Validate before calling
// Sanity-check the step node XML before loadXML
Node stepsNode = XMLHandler.getSubNode(stepnode, "steps");
if (stepsNode == null || XMLHandler.countNodes(stepsNode, "step") == 0) throw new IllegalStateException("missing <steps> in Prioritize Streams XML"); Try / catch
try { meta.loadXML(stepNode, databases, metaStore); } catch (KettleXMLException e) { log.error("Bad PrioritizeStreams XML: " + e.getCause(), e); throw e; } Prevention
- Edit transformations only through Spoon or the metadata API
- Validate .ktr files with an XML schema/linter in CI
- Pin PDI versions across teams sharing transformation files
When it happens
Trigger: loadXML hands readData a step node where the <steps> container or its <step> children are missing/malformed, so XMLHandler calls throw while extracting step names.
Common situations: Manually edited ktr; XML generated by an incompatible PDI version; truncated or corrupted transformation file.
Related errors
- PGPEncryptStreamMeta.Exception.UnableToReadStepInfo
- DBProcMeta.Exception.UnableToReadStepInfo
- MergeJoinMeta.Exception.UnableToLoadStepInfo
- MergeRowsMeta.Exception.UnableToLoadStepInfo
- SampleRowsMeta.Exception.UnableToReadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/e09fe2453a319090.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/prioritizestreams/PrioritizeStreamsMeta.java:109
@Override
public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
// Default: nothing changes to rowMeta
}
private void readData( Node stepnode, List<DatabaseMeta> databases ) throws KettleXMLException {
try {
Node steps = XMLHandler.getSubNode( stepnode, "steps" );
int nrsteps = XMLHandler.countNodes( steps, "step" );
allocate( nrsteps );
for ( int i = 0; i < nrsteps; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( steps, "step", i );
stepName[i] = XMLHandler.getTagValue( fnode, "name" );
}
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to load step info from XML", e );
}
}
public String getXML() {
StringBuilder retval = new StringBuilder();
retval.append( " <steps>" + Const.CR );
for ( int i = 0; i < stepName.length; i++ ) {
retval.append( " <step>" + Const.CR );
retval.append( " " + XMLHandler.addTagValue( "name", stepName[i] ) );
retval.append( " </step>" + Const.CR );
}
retval.append( " </steps>" + Const.CR );
return retval.toString();
}
public void setDefault() {View on GitHub (pinned to f3058517a1)