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

  1. Open the .ktr in a text editor and inspect the LDIF Input <step> XML block for malformed/missing tags.
  2. Restore the transformation from backup or version control.
  3. Recreate the LDIF Input step in Spoon (drag a fresh one and reconfigure).
  4. 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

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


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)