pentaho/pentaho-kettle · error · KettleXMLException
Unable to load step info from XML
Error message
Unable to load step info from XML
What it means
GetFilesRowsCountMeta.readData() wraps any exception raised while parsing this step's XML definition (file name, mask, exclude mask, required, include-subfolders nodes per file) into a KettleXMLException with message 'Unable to load step info from XML'. It means the step could not be reconstructed from the transformation's .ktr XML.
Solutions
- Open the .ktr in a text editor and repair/complete the step's XML nodes.
- Recreate the step in Spoon and re-save to regenerate valid XML.
- Check the Kettle version compatibility of the file.
- Inspect the wrapped cause for the exact missing node.
Example fix
// before (malformed XML) <fields><filename_field>fname</filename_field></fields> <!-- missing <file> entries --> // after <file><name>a.txt</name><filemask>.*</filemask><excludefilemask/><file_required>N</file_required><include_subfolders>N</include_subfolders></file>
Defensive patterns
Strategy: try-catch
Validate before calling
Document doc = XMLHandler.loadXMLFile(ktrFile); if (doc == null || XMLHandler.getSubNode(doc, "transformation") == null) throw new IllegalArgumentException("Invalid or truncated .ktr file"); Try / catch
try { transMeta = new TransMeta(ktrFile, true); } catch (KettleXMLException e) { log.error("Unable to load step info from XML: " + e.getMessage(), e.getCause()); /* fall back to last good backup */ } Prevention
- Never hand-edit .ktr files without validating XML afterwards
- Keep transformation backups (version control)
- Ensure the same or newer Kettle version reads files it wrote
- Validate XML structure after failed/interrupted saves
When it happens
Trigger: loadXML() calls readData() and an XMLHandler.getNodeValue/getNodes call fails or the code assumes a node exists (NPE) — typically a truncated or hand-edited .ktr file missing <file> child nodes.
Common situations: Manually edited or corrupted .ktr files; files written by an incompatible Kettle version lacking expected nodes; XML truncated by a failed save.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- It was not possible to load the metadata for this step from…
- AppendMeta.Exception.UnableToLoadStepInfo
- AppendMeta.Exception.UnexpectedErrorReadingStepInfo
- CombinationLookupMeta.Exception.UnexpectedErrorWhileReadingS…
- CombinationLookupMeta.Exception.UnableToLoadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/bdeaff2f52c10cca.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/getfilesrowscount/GetFilesRowsCountMeta.java:453
Node filenode = XMLHandler.getSubNode( stepnode, "file" );
int nrFiles = XMLHandler.countNodes( filenode, "name" );
allocate( nrFiles );
for ( int i = 0; i < nrFiles; i++ ) {
Node filenamenode = XMLHandler.getSubNodeByNr( filenode, "name", i );
Node filemasknode = XMLHandler.getSubNodeByNr( filenode, "filemask", i );
Node excludefilemasknode = XMLHandler.getSubNodeByNr( filenode, "exclude_filemask", i );
Node fileRequirednode = XMLHandler.getSubNodeByNr( filenode, "file_required", i );
Node includeSubFoldersnode = XMLHandler.getSubNodeByNr( filenode, "include_subfolders", i );
fileName[i] = XMLHandler.getNodeValue( filenamenode );
fileMask[i] = XMLHandler.getNodeValue( filemasknode );
excludeFileMask[i] = XMLHandler.getNodeValue( excludefilemasknode );
fileRequired[i] = XMLHandler.getNodeValue( fileRequirednode );
includeSubFolders[i] = XMLHandler.getNodeValue( includeSubFoldersnode );
}
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to load step info from XML", e );
}
}
public void allocate( int nrfiles ) {
fileName = new String[nrfiles];
fileMask = new String[nrfiles];
excludeFileMask = new String[nrfiles];
fileRequired = new String[nrfiles];
includeSubFolders = new String[nrfiles];
}
public void setDefault() {
smartCount = false;
outputFilenameField = "";
filefield = false;
isaddresult = true;
includeFilesCount = false;
filesCountFieldName = "";View on GitHub (pinned to f3058517a1)