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

  1. Open the .ktr in a text editor and repair/complete the step's XML nodes.
  2. Recreate the step in Spoon and re-save to regenerate valid XML.
  3. Check the Kettle version compatibility of the file.
  4. 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

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


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)