pentaho/pentaho-kettle · error · KettleXMLException

CreditCardValidatorMeta.Exception.UnableToReadStepInfo

CreditCardValidatorMeta.Exception.UnableToReadStepInfo

Error message

CreditCardValidatorMeta.Exception.UnableToReadStepInfo

What it means

CreditCardValidatorMeta.loadXML reads step configuration from a transformation XML node via readData. If any XMLHandler.getTagValue call or parsing throws, the exception is wrapped in a KettleXMLException with UnableToReadStepInfo, chained to the original cause, indicating the step's saved XML could not be parsed.

Solutions

  1. Open the .ktr and inspect the <credit_card_validator> XML node for malformed tags
  2. Re-create the step in Spoon and re-save the transformation
  3. Compare the XML against a working transformation from the same PDI version

Example fix

// before
<credit_card_validator><fieldname
// after (well-formed XML)
<credit_card_validator><fieldname>card</fieldname></credit_card_validator>
Defensive patterns

Strategy: try-catch

Validate before calling

// validate XML before loading
Document d = XMLHandler.loadXMLFile(new File("trans.ktr")); // fails fast on malformed XML

Try / catch

try { meta.loadXML(stepnode, databases, metaStore); } catch (KettleXMLException e) { logError("Corrupt step XML: " + e.getCause()); }

Prevention

When it happens

Trigger: Loading a .ktr whose CreditCardValidator step node is malformed, contains an unexpected child, or XMLHandler throws while reading tags like fieldname/resultfieldname/cardtype.

Common situations: Hand-edited or truncated transformation files; transformations exported from a newer Pentaho version and opened in an older one; corrupted repository export.

Related errors


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

Appendix: source

Thrown at plugins/credit-card-validator/impl/src/main/java/org/pentaho/di/trans/steps/creditcardvalidator/CreditCardValidatorMeta.java:207

    retval.append( "    " ).append( XMLHandler.addTagValue( "fieldname", fieldname ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "resultfieldname", resultfieldname ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "cardtype", cardtype ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "onlydigits", onlydigits ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "notvalidmsg", notvalidmsg ) );

    return retval.toString();
  }

  private void readData( Node stepnode ) throws KettleXMLException {
    try {
      fieldname = XMLHandler.getTagValue( stepnode, "fieldname" );
      resultfieldname = XMLHandler.getTagValue( stepnode, "resultfieldname" );
      cardtype = XMLHandler.getTagValue( stepnode, "cardtype" );
      notvalidmsg = XMLHandler.getTagValue( stepnode, "notvalidmsg" );
      onlydigits = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "onlydigits" ) );

    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "CreditCardValidatorMeta.Exception.UnableToReadStepInfo" ), e );
    }
  }

  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
    try {
      fieldname = rep.getStepAttributeString( id_step, "fieldname" );
      resultfieldname = rep.getStepAttributeString( id_step, "resultfieldname" );
      cardtype = rep.getStepAttributeString( id_step, "cardtype" );
      notvalidmsg = rep.getStepAttributeString( id_step, "notvalidmsg" );
      onlydigits = rep.getStepAttributeBoolean( id_step, "onlydigits" );

    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "CreditCardValidatorMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

View on GitHub (pinned to f3058517a1)