pentaho/pentaho-kettle · error · KettleXMLException

GetTableNamesMeta.Exception.UnableToReadStepInfo

GetTableNamesMeta.Exception.UnableToReadStepInfo

Error message

GetTableNamesMeta.Exception.UnableToReadStepInfo

What it means

GetTableNamesMeta.readData (invoked via loadXML) parses the step's XML node to rebuild step metadata and wraps any parsing exception in a KettleXMLException with this localized message. It means the step's configuration could not be read from the transformation XML — the .ktr node is malformed or contains unexpected content.

Solutions

  1. Check e.getCause() to identify the exact parsing failure (number format, null node, etc.).
  2. Open the .ktr in Spoon and delete/re-add the Get Table Names step to regenerate clean XML.
  3. Validate the XML file is well-formed (xmllint) and not truncated.
  4. If migrating from 7.0, confirm the legacy 'schenameNameField' fallback applies or manually rename the tag to 'schemaNameField'.

Example fix

// before: hand-edited XML tag mismatch
<schenameNameField>mySchema</schenameNameField> <!-- 7.0 typo tag -->
// after: regenerate step XML with the correct tag
<schemaNameField>mySchema</schemaNameField>
Defensive patterns

Strategy: try-catch

Validate before calling

// validate the .ktr parses as XML before loading
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new File( ktrPath ) );

Try / catch

try {
  TransMeta tm = new TransMeta( ktrPath );
} catch ( KettleXMLException e ) {
  logError( "Step XML unreadable: " + e.getCause() + " - recreate the step in Spoon" );
}

Prevention

When it happens

Trigger: loadXML calls readData on a <step> node whose child tags are missing or of unexpected type (e.g. XMLHandler.getTagValue returns bad data, NumberFormatException from tag-value-to-int conversions); includes the 7.0 legacy 'schenameNameField' compatibility path.

Common situations: Hand-edited or truncated .ktr file; transformation produced by a different/older Pentaho version whose XML tags don't match; XML corrupted by a bad merge or diff tool.

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/c6eacae93743273c. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/gettablenames/GetTableNamesMeta.java:400

      includeCatalog = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeCatalog" ) );
      includeSchema = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeSchema" ) );
      includeTable = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeTable" ) );
      includeView = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeView" ) );
      includeProcedure = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeProcedure" ) );
      includeSynonym = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "includeSynonym" ) );
      addSchemaInOutput = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "addSchemaInOutput" ) );
      dynamicSchema = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "dynamicSchema" ) );
      schemaNameField = XMLHandler.getTagValue( stepnode, "schemaNameField" );

      if ( XMLHandler.getTagValue( stepnode, "schenameNameField" ) != null ) {
        /*
         * Fix for wrong field name in the 7.0. Can be removed if we don't want to keep backward compatibility with 7.0
         * tranformations.
         */
        schemaNameField = XMLHandler.getTagValue( stepnode, "schenameNameField" );
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "GetTableNamesMeta.Exception.UnableToReadStepInfo" ), e );
    }
  }

  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
    try {
      this.databases = databases;
      database = rep.loadDatabaseMetaFromStepAttribute( id_step, "id_connection", databases );
      schemaname = rep.getStepAttributeString( id_step, "schemaname" );
      tablenamefieldname = rep.getStepAttributeString( id_step, "tablenamefieldname" );
      objecttypefieldname = rep.getStepAttributeString( id_step, "objecttypefieldname" );
      sqlcreationfieldname = rep.getStepAttributeString( id_step, "sqlcreationfieldname" );

      issystemobjectfieldname = rep.getStepAttributeString( id_step, "issystemobjectfieldname" );
      includeCatalog = rep.getStepAttributeBoolean( id_step, "includeCatalog" );
      includeSchema = rep.getStepAttributeBoolean( id_step, "includeSchema" );
      includeTable = rep.getStepAttributeBoolean( id_step, "includeTable" );
      includeView = rep.getStepAttributeBoolean( id_step, "includeView" );

View on GitHub (pinned to f3058517a1)