pentaho/pentaho-kettle · error · KettleXMLException

Unable to load step info from XML

Error message

Unable to load step info from XML

What it means

ElasticSearchBulkMeta.loadXML() parses the step's XML node (settings, servers, etc.) with XMLHandler; any exception during parsing is wrapped in a KettleXMLException with the literal message 'Unable to load step info from XML'. It indicates the saved transformation XML for this step is malformed or missing expected tags.

Solutions

  1. Open the .ktr in a text editor and validate the XML well-formedness and the step's <settings> block
  2. Recreate the step in Spoon and re-save the transformation
  3. Align plugin versions — open with the same or newer Pentaho/plugin version that wrote the file
Defensive patterns

Strategy: validation

Validate before calling

// validate the .ktr XML before loading it in Pentaho
xmllint --noout transformation.ktr && echo OK
// check the step node contains a <settings> element:
grep -c '<settings>' transformation.ktr

Try / catch

try { transMeta = TransMetaFactory.create(path, rep); } catch (KettleXMLException e) {
  log.error("Corrupt step XML: " + e.getMessage(), e);
  throw new IOException("Fix or regenerate the .ktr file", e);
}

Prevention

When it happens

Trigger: loadXML (public StepMetaInterface method) called while opening/loading a .ktr: XMLHandler.getTagValue returns unexpected structure or throws because a required node is absent or the XML is corrupted.

Common situations: Hand-edited or truncated .ktr file, transformation saved by a newer plugin version then opened with an older one, copy-pasted step XML missing <settings> child nodes.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/6ae276f132908556. Report an issue: GitHub.

Appendix: source

Thrown at plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulkMeta.java:461

        }
        this.addServer( addr, port );
      }

      // Settings
      Node settings = XMLHandler.getSubNode( stepnode, Dom.TAG_SETTINGS );
      int nrSettings = XMLHandler.countNodes( settings, Dom.TAG_SETTING );
      this.clearSettings();
      for ( int i = 0; i < nrSettings; i++ ) {
        Node sNode = XMLHandler.getSubNodeByNr( settings, Dom.TAG_SETTING, i );

        String name = XMLHandler.getTagValue( sNode, Dom.TAG_SETTING_NAME );
        String value = XMLHandler.getTagValue( sNode, Dom.TAG_SETTING_VALUE );

        this.addSetting( name, value );
      }

    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load step info from XML", e );
    }
  }

  private static boolean parseBool( String val ) {
    return "Y".equals( val );
  }

  public String getXML() {
    StringBuffer retval = new StringBuffer();
    Indentation indent = new Indentation();

    indent.incr().incr();

    // General
    retval.append( indent.toString() ).append( XMLHandler.openTag( Dom.TAG_GENERAL ) ).append( Const.CR );
    indent.incr();

    retval.append( indent.toString() + XMLHandler.addTagValue( Dom.TAG_INDEX, getIndex() ) );

View on GitHub (pinned to f3058517a1)