{"record":{"id":"bdeaff2f52c10cca","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-step-info-from-xml-getfilesrowscountmeta","errorCode":null,"errorMessage":"Unable to load step info from XML","messagePattern":"Unable to load step info from XML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/getfilesrowscount/GetFilesRowsCountMeta.java","lineNumber":453,"sourceCode":"      Node filenode = XMLHandler.getSubNode( stepnode, \"file\" );\n      int nrFiles = XMLHandler.countNodes( filenode, \"name\" );\n      allocate( nrFiles );\n\n      for ( int i = 0; i < nrFiles; i++ ) {\n        Node filenamenode = XMLHandler.getSubNodeByNr( filenode, \"name\", i );\n        Node filemasknode = XMLHandler.getSubNodeByNr( filenode, \"filemask\", i );\n        Node excludefilemasknode = XMLHandler.getSubNodeByNr( filenode, \"exclude_filemask\", i );\n        Node fileRequirednode = XMLHandler.getSubNodeByNr( filenode, \"file_required\", i );\n        Node includeSubFoldersnode = XMLHandler.getSubNodeByNr( filenode, \"include_subfolders\", i );\n        fileName[i] = XMLHandler.getNodeValue( filenamenode );\n        fileMask[i] = XMLHandler.getNodeValue( filemasknode );\n        excludeFileMask[i] = XMLHandler.getNodeValue( excludefilemasknode );\n        fileRequired[i] = XMLHandler.getNodeValue( fileRequirednode );\n        includeSubFolders[i] = XMLHandler.getNodeValue( includeSubFoldersnode );\n      }\n\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"Unable to load step info from XML\", e );\n    }\n  }\n\n  public void allocate( int nrfiles ) {\n    fileName = new String[nrfiles];\n    fileMask = new String[nrfiles];\n    excludeFileMask = new String[nrfiles];\n    fileRequired = new String[nrfiles];\n    includeSubFolders = new String[nrfiles];\n  }\n\n  public void setDefault() {\n    smartCount = false;\n    outputFilenameField = \"\";\n    filefield = false;\n    isaddresult = true;\n    includeFilesCount = false;\n    filesCountFieldName = \"\";","sourceCodeStart":435,"sourceCodeEnd":471,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/getfilesrowscount/GetFilesRowsCountMeta.java#L435-L471","documentation":"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.","triggerScenarios":"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.","commonSituations":"Manually edited or corrupted .ktr files; files written by an incompatible Kettle version lacking expected nodes; XML truncated by a failed save.","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."],"exampleFix":"// before (malformed XML)\n<fields><filename_field>fname</filename_field></fields> <!-- missing <file> entries -->\n// after\n<file><name>a.txt</name><filemask>.*</filemask><excludefilemask/><file_required>N</file_required><include_subfolders>N</include_subfolders></file>","handlingStrategy":"try-catch","validationCode":"Document doc = XMLHandler.loadXMLFile(ktrFile); if (doc == null || XMLHandler.getSubNode(doc, \"transformation\") == null) throw new IllegalArgumentException(\"Invalid or truncated .ktr file\");","typeGuard":null,"tryCatchPattern":"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 */ }","preventionTips":["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"],"tags":["kettle","xml-parse","metadata-load","ktr"],"backgroundTag":"json-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}