pentaho/pentaho-kettle · error · KettleXMLException

Unable to read step info from XML node

Error message

Unable to read step info from XML node

What it means

DummyPluginMeta.loadXML wraps any failure while deserializing the step's <values><value> node from a .ktr XML file into a KettleXMLException with this fixed message. It fires when XMLHandler navigation or ValueMetaAndData.loadXML throws, e.g. malformed XML, a missing/corrupt value node, or data that cannot be converted back into a ValueMeta. The original exception is preserved as the cause.

Solutions

  1. Open the .ktr in a text editor and validate the <values><value> block for this Dummy step; fix or delete the malformed node.
  2. Check the chained cause exception (e.getCause()) — it names the exact parse/conversion failure inside ValueMetaAndData.loadXML.
  3. Recreate the Dummy step in Spoon (its setDefault() supplies a valid default value of 123.456) and re-save the transformation.
  4. Verify the file's XML declaration/encoding matches the actual bytes (UTF-8 vs ISO-8859-1).

Example fix

// before: hand-edited ktr with corrupt value
<values><value><name>amt</name><type>Number</type>12a.45</value></values>
// after: valid node matching ValueMetaAndData.loadXML format
<values><value><name>valuename</name><type>Number</type><length>12</length><precision>4</precision><isnull>N</isnull>123.456</value></values>
Defensive patterns

Strategy: validation

Validate before calling

// validate the ktr XML before loading
Document doc = XMLHandler.loadXMLFile( new File( "trans.ktr" ) );
Node step = XMLHandler.getSubNode( doc, "transformation", "step" );
if ( XMLHandler.getSubNode( step, "values" ) == null ) {
  throw new IllegalStateException( "Dummy step missing <values> section" );
}

Try / catch

try {
  stepMeta.loadXML( stepnode, databases, counters );
} catch ( KettleXMLException e ) {
  logError( "Bad XML for step: " + e.getMessage() + ", cause=" + e.getCause() );
  // fall back to defaults or skip the step
  stepMeta.setDefault();
}

Prevention

When it happens

Trigger: Calling loadXML (directly or via TransMeta/Spoon loading a transformation) on a stepnode whose <values> section is absent-but-malformed, or whose <value> child contains attributes/elements ValueMetaAndData.loadXML cannot parse (bad name_type encoding, unparseable number/date text).

Common situations: Hand-edited or truncated .ktr files; transformations generated by other tools or older PDI versions whose <value> XML no longer matches ValueMetaAndData's expected format; XML files with encoding/charset corruption.

Related errors


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

Appendix: source

Thrown at plugins/dummy/core/src/main/java/org/pentaho/di/be/ibridge/kettle/dummy/DummyPluginMeta.java:125

  @Override
  public Object clone() {
    Object retval = super.clone();
    return retval;
  }

  @Override
  public void loadXML( Node stepnode, List<DatabaseMeta> databases, Map<String, Counter> counters ) throws KettleXMLException {
    try {
      value = new ValueMetaAndData();

      Node valnode = XMLHandler.getSubNode( stepnode, "values", "value" );
      if ( valnode != null ) {
        System.out.println( "reading value in " + valnode );
        value.loadXML( valnode );
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to read step info from XML node", e );
    }
  }

  @Override
  public void setDefault() {
    value = new ValueMetaAndData( new ValueMetaNumber( "valuename" ), new Double( 123.456 ) );
    value.getValueMeta().setLength( 12 );
    value.getValueMeta().setPrecision( 4 );
  }

  @Override
  public void readRep( Repository rep, ObjectId id_step, List<DatabaseMeta> databases, Map<String, Counter> counters ) throws KettleException {
    try {
      String name = rep.getStepAttributeString( id_step, 0, "value_name" );
      String typedesc = rep.getStepAttributeString( id_step, 0, "value_type" );
      String text = rep.getStepAttributeString( id_step, 0, "value_text" );
      boolean isnull = rep.getStepAttributeBoolean( id_step, 0, "value_null" );
      int length = (int) rep.getStepAttributeInteger( id_step, 0, "value_length" );

View on GitHub (pinned to f3058517a1)