pentaho/pentaho-kettle · error · KettleXMLException

Unable to load step info from XML

Error message

Unable to load step info from XML

What it means

Thrown by PaloCellInputMeta.readData (invoked by loadXML) when parsing the step's XML representation fails for any reason. readData wraps any exception from XMLHandler tag extraction or field-list construction into a KettleXMLException.

Solutions

  1. Inspect the chained cause exception to find the exact parse failure.
  2. Open the .ktr in a text editor and verify the PALO cell input step's XML block is complete and well-formed.
  3. Reopen and re-save the transformation in Spoon to regenerate valid XML.
  4. Upgrade the PALO plugin so the XML schema matches the reader's expectations.

Example fix

null
Defensive patterns

Strategy: validation

Validate before calling

Document doc = XMLHandler.loadXMLFile(xmlFile); /* check expected tags exist before loadXML: cube, fields nodes */

Try / catch

try { stepMeta.loadXML(...) } catch (KettleXMLException e) { log.error("step XML invalid", e.getCause()); /* repair or regenerate .ktr */ }

Prevention

When it happens

Trigger: loadXML called on XML whose expected tags (cube name, database meta, field dimensionname/fieldname/fieldtype nodes) are missing, malformed, or of unexpected structure.

Common situations: Hand-edited or truncated .ktr files; transformation XML produced by an older plugin version with a different schema; copy-paste corruption of step XML between files.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/cellinput/PaloCellInputMeta.java:121

      String cubeMeasureName = XMLHandler.getTagValue( stepnode, "cubemeasurename" );
      String cubeMeasureType = XMLHandler.getTagValue( stepnode, "cubemeasuretype" );
      this.cubeMeasure = new DimensionField( "Measure", cubeMeasureName, cubeMeasureType );

      this.fields = new ArrayList<DimensionField>();

      Node levels = XMLHandler.getSubNode( stepnode, "fields" );
      int nrLevels = XMLHandler.countNodes( levels, "field" );

      for ( int i = 0; i < nrLevels; i++ ) {
        Node fnode = XMLHandler.getSubNodeByNr( levels, "field", i );

        String dimensionName = XMLHandler.getTagValue( fnode, "dimensionname" );
        String fieldName = XMLHandler.getTagValue( fnode, "fieldname" );
        String fieldType = XMLHandler.getTagValue( fnode, "fieldtype" );
        this.fields.add( new DimensionField( dimensionName, fieldName, fieldType ) );
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load step info from XML", e );
    }
  }

  @Override
  public void setDefault() {
  }

  @Override
  public void getFields( Bowl bowl, final RowMetaInterface row, final String origin, final RowMetaInterface[] info,
      final StepMeta nextStep, final VariableSpace space, Repository repository, IMetaStore metaStore )
    throws KettleStepException {
    if ( databaseMeta == null ) {
      throw new KettleStepException( "There is no Palo database server connection defined" );
    }
    final PaloHelper helper = new PaloHelper( databaseMeta, DefaultLogLevel.getLogLevel() );
    try {
      helper.connect();
      try {

View on GitHub (pinned to f3058517a1)