pentaho/pentaho-kettle · error · KettleXMLException
Unable to load step info from XML
Error message
Unable to load step info from XML
What it means
LDIFInputMeta's XML constructor (loadXML) wraps parsing of the step's saved XML in a try/catch and throws KettleXMLException('Unable to load step info from XML') if any XMLHandler call fails. This means the .ktr/.kjb file's XML for this step is malformed or missing expected tags, so the step metadata cannot be deserialized when the transformation loads.
Solutions
- Open the .ktr in a text editor and inspect the LDIF Input <step> XML block for malformed/missing tags.
- Restore the transformation from backup or version control.
- Recreate the LDIF Input step in Spoon (drag a fresh one and reconfigure).
- Align Pentaho/plugin versions between the writer and reader of the file.
Example fix
// before (hand-edited .ktr) // <filenamefield></filenamesfield> <!-- mismatched tag --> // after // <filenamefield></filenamefield>
Defensive patterns
Strategy: try-catch
Validate before calling
// Validate .ktr XML is well-formed before load
DocumentBuilderFactory.newInstance().newDocumentBuilder()
.parse(new File("trans.ktr")); // throws if malformed Try / catch
try {
TransMeta tm = new TransMeta("trans.ktr");
} catch (KettleXMLException e) {
log.error("Corrupt step XML: restore from VCS/backup or recreate the step", e);
} Prevention
- Never hand-edit .ktr XML without validating afterward
- Keep transformations in version control
- Keep Pentaho versions consistent between writers and readers
When it happens
Trigger: Opening/saving a transformation whose repository XML for the LDIF Input step is corrupt, hand-edited incorrectly, truncated, or produced by an incompatible plugin version (missing stepnode tags).
Common situations: Manually editing a .ktr file and breaking the <step> block; XML written by a newer/older Pentaho version with schema drift; corrupted file transfer (truncated XML); merge conflicts in a VCS-managed .ktr.
Related errors
- AddSequenceMeta.Exception.ErrorLoadingStepInfo
- InsertUpdateMeta.Exception.UnableToReadStepInfoFromXML
- LoadFileInputMeta.Exception.ErrorLoadingXML
- Unable to load step info from XML
- Unable to load step info from XML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3600e89b966dae57.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ldifinput/LDIFInputMeta.java:742
for ( int i = 0; i < nrFields; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i );
LDIFInputField field = new LDIFInputField( fnode );
inputFields[i] = field;
}
// Is there a limit on the number of rows we process?
rowLimit = Const.toLong( XMLHandler.getTagValue( stepnode, "limit" ), 0L );
shortFileFieldName = XMLHandler.getTagValue( stepnode, "shortFileFieldName" );
pathFieldName = XMLHandler.getTagValue( stepnode, "pathFieldName" );
hiddenFieldName = XMLHandler.getTagValue( stepnode, "hiddenFieldName" );
lastModificationTimeFieldName = XMLHandler.getTagValue( stepnode, "lastModificationTimeFieldName" );
uriNameFieldName = XMLHandler.getTagValue( stepnode, "uriNameFieldName" );
rootUriNameFieldName = XMLHandler.getTagValue( stepnode, "rootUriNameFieldName" );
extensionFieldName = XMLHandler.getTagValue( stepnode, "extensionFieldName" );
sizeFieldName = XMLHandler.getTagValue( stepnode, "sizeFieldName" );
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to load step info from XML", e );
}
}
public void allocate( int nrfiles, int nrfields ) {
fileName = new String[nrfiles];
fileMask = new String[nrfiles];
excludeFileMask = new String[nrfiles];
fileRequired = new String[nrfiles];
includeSubFolders = new String[nrfiles];
inputFields = new LDIFInputField[nrfields];
}
public void setDefault() {
shortFileFieldName = null;
pathFieldName = null;
hiddenFieldName = null;
lastModificationTimeFieldName = null;View on GitHub (pinned to f3058517a1)