pentaho/pentaho-kettle · error · KettleXMLException

Unable to load step info from XML

Error message

Unable to load step info from XML

What it means

KettleXMLException thrown by PrioritizeStreamsMeta.readData (via loadXML) when parsing the step's XML fails. It reads the <steps> node and each <step> sub-node to get the names of the streams to prioritize; any exception during that is wrapped with this generic message. It indicates malformed or incompatible XML for this step.

Solutions

  1. Validate the .ktr XML around the Prioritize Streams step node, ensuring <steps><step><name>... structure is intact.
  2. Recreate/re-save the step in Spoon to regenerate valid XML.
  3. Re-export the transformation from the original PDI version if a version mismatch is suspected.

Example fix

// before: missing <steps> wrapper
<step><type>PrioritizeStreams</type></step>
// after
<step><type>PrioritizeStreams</type><fields><steps><step><name>Input A</name></step></steps></fields></step>
Defensive patterns

Strategy: try-catch

Validate before calling

// Sanity-check the step node XML before loadXML
Node stepsNode = XMLHandler.getSubNode(stepnode, "steps");
if (stepsNode == null || XMLHandler.countNodes(stepsNode, "step") == 0) throw new IllegalStateException("missing <steps> in Prioritize Streams XML");

Try / catch

try { meta.loadXML(stepNode, databases, metaStore); } catch (KettleXMLException e) { log.error("Bad PrioritizeStreams XML: " + e.getCause(), e); throw e; }

Prevention

When it happens

Trigger: loadXML hands readData a step node where the <steps> container or its <step> children are missing/malformed, so XMLHandler calls throw while extracting step names.

Common situations: Manually edited ktr; XML generated by an incompatible PDI version; truncated or corrupted transformation file.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/prioritizestreams/PrioritizeStreamsMeta.java:109

  @Override
  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Default: nothing changes to rowMeta
  }

  private void readData( Node stepnode, List<DatabaseMeta> databases ) throws KettleXMLException {
    try {
      Node steps = XMLHandler.getSubNode( stepnode, "steps" );
      int nrsteps = XMLHandler.countNodes( steps, "step" );

      allocate( nrsteps );

      for ( int i = 0; i < nrsteps; i++ ) {
        Node fnode = XMLHandler.getSubNodeByNr( steps, "step", i );
        stepName[i] = XMLHandler.getTagValue( fnode, "name" );
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load step info from XML", e );
    }
  }

  public String getXML() {
    StringBuilder retval = new StringBuilder();

    retval.append( "    <steps>" + Const.CR );
    for ( int i = 0; i < stepName.length; i++ ) {
      retval.append( "      <step>" + Const.CR );
      retval.append( "        " + XMLHandler.addTagValue( "name", stepName[i] ) );
      retval.append( "        </step>" + Const.CR );
    }
    retval.append( "      </steps>" + Const.CR );

    return retval.toString();
  }

  public void setDefault() {

View on GitHub (pinned to f3058517a1)