pentaho/pentaho-kettle · error · KettleXMLException

SASInputMeta.Exception.UnableToReadStepInformationFromXML

SASInputMeta.Exception.UnableToReadStepInformationFromXML

Error message

SASInputMeta.Exception.UnableToReadStepInformationFromXML

What it means

loadXML parses the step's saved XML definition to rebuild SasInputMeta; if any part fails (missing nodes, malformed XML, bad field nodes), it wraps the exception in a KettleXMLException using the localized message 'SASInputMeta.Exception.UnableToReadStepInformationFromXML'.

Solutions

  1. Open the .ktr file in a text editor and check the SAS input step's XML block for malformed or missing <fields> entries.
  2. Recreate the step in Spoon and re-save the transformation.
  3. Ensure the Pentaho Data Integration version that saved the file matches (or is newer than) the version opening it.
  4. Restore the transformation from backup/version control.

Example fix

// before: hand-edited XML missing a field attribute
// after: <field><name>amount</name><rename/><length>-1</length><precision>-1</precision></field>
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate the step XML before loading the transformation
Node sasNode = XMLHandler.getSubNode(transMetaXml, "step");
if (XMLHandler.getTagValue(sasNode, "fields") == null)
  throw new IllegalStateException("SAS input step XML is missing its <fields> section");

Try / catch

try {
  transMeta = new TransMeta(ktrFile);
} catch (KettleXMLException e) {
  if (e.getMessage().contains("UnableToReadStepInformationFromXML")) {
    // inspect/repair the .ktr XML for the SAS input step or restore from backup
  }
  throw e;
}

Prevention

When it happens

Trigger: Exception thrown in loadXML while reading the step node — e.g. the XML_TAG_FIELD subnodes count is wrong, fieldNode is null, or SasInputField(Node) fails to parse an attribute.

Common situations: A .ktr file edited by hand or corrupted; transformation saved with a different plugin version whose XML schema changed; truncated file transfer; mixing Pentaho versions when opening transformations.

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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/sasinput/SasInputMeta.java:80

    super(); // allocate BaseStepMeta
  }

  @Override
  public void setDefault() {
    outputFields = new ArrayList<SasInputField>();
  }

  public void loadXML( Node stepnode, List<DatabaseMeta> databases, IMetaStore metaStore ) throws KettleXMLException {
    try {
      acceptingField = XMLHandler.getTagValue( stepnode, "accept_field" );
      int nrFields = XMLHandler.countNodes( stepnode, XML_TAG_FIELD );
      outputFields = new ArrayList<SasInputField>();
      for ( int i = 0; i < nrFields; i++ ) {
        Node fieldNode = XMLHandler.getSubNodeByNr( stepnode, XML_TAG_FIELD, i );
        outputFields.add( new SasInputField( fieldNode ) );
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "SASInputMeta.Exception.UnableToReadStepInformationFromXML" ), e );
    }
  }

  public Object clone() {
    SasInputMeta retval = (SasInputMeta) super.clone();
    retval.setOutputFields( new ArrayList<SasInputField>() );
    for ( SasInputField field : outputFields ) {
      retval.getOutputFields().add( field.clone() );
    }
    return retval;
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface row, String name, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {

    for ( SasInputField field : outputFields ) {

View on GitHub (pinned to f3058517a1)