pentaho/pentaho-kettle · error · KettleXMLException

Unable to load step info from XML

Error message

Unable to load step info from XML

What it means

RssOutputMeta.loadXML() throws KettleXMLException 'Unable to load step info from XML' when any exception occurs while deserializing the step's configuration from the .ktr file — e.g. malformed XML nodes, missing expected subnodes, or numeric conversion failures while reading attributes like displayitem, customrss, or the namespace arrays.

Solutions

  1. Validate the .ktr file is well-formed XML and inspect the <step type="RssOutput"> block for malformed or missing tags.
  2. Restore the transformation from version control or a backup copy.
  3. Recreate the RSS Output step in Spoon and re-enter its settings, replacing the corrupt step XML.
  4. Ensure the plugin version matches the Pentaho version that saved the file (version drift in XML schema).

Example fix

// before (hand-edited ktr, broken node)
<custom_rss></custom>
// after
<custom_rss>N</custom_rss>
Defensive patterns

Strategy: try-catch

Validate before calling

// Validate the .ktr is well-formed before loading:
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
f.parse(new File("transformation.ktr")); // throws if XML is malformed

Try / catch

try {
    transMeta = new TransMeta(ktrPath);
} catch (KettleXMLException e) {
    if (e.getMessage().contains("Unable to load step info from XML")) {
        log.error("Corrupt or incompatible RssOutput step XML; restore from backup or recreate the step", e);
    }
}

Prevention

When it happens

Trigger: loadXML reads the step node via XMLHandler and any getSubNode/getTagValue/parseInt call throws — typically a corrupt or hand-edited .ktr file, or a file saved by a different plugin version whose XML shape differs from what this loader expects.

Common situations: Manually editing the .ktr file and breaking the <rss_output> step XML; merging transformations with a diff tool producing invalid XML; opening a transformation saved in a newer Pentaho version with an older plugin that lacks the namespace/keyfields nodes; truncated file from a failed checkout or transfer.

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

Appendix: source

Thrown at plugins/rss/impl/src/main/java/org/pentaho/di/trans/steps/rssoutput/RssOutputMeta.java:692

      allocateitem( nritemfields );

      for ( int i = 0; i < nritemfields; i++ ) {
        Node knode = XMLHandler.getSubNodeByNr( keys, "item_custom_fields", i );
        ItemCustomTags[i] = XMLHandler.getTagValue( knode, "tag" );
        ItemCustomFields[i] = XMLHandler.getTagValue( knode, "field" );
      }
      // NameSpaces
      Node keysNameSpaces = XMLHandler.getSubNode( stepnode, "namespaces" );
      int nrnamespaces = XMLHandler.countNodes( keysNameSpaces, "namespace" );
      allocatenamespace( nrnamespaces );
      for ( int i = 0; i < nrnamespaces; i++ ) {
        Node knode = XMLHandler.getSubNodeByNr( keysNameSpaces, "namespace", i );
        NameSpacesTitle[i] = XMLHandler.getTagValue( knode, "namespace_tag" );
        NameSpaces[i] = XMLHandler.getTagValue( knode, "namespace_value" );
      }

    } catch ( Exception e ) {
      throw new KettleXMLException( "Unable to load step info from XML", e );
    }
  }

  public void setDefault() {
    displayitem = true;
    customrss = false;
    channeltitle = null;
    channeldescription = null;
    channellink = null;
    channelpubdate = null;
    channelcopyright = null;
    channelimagetitle = null;
    channelimagelink = null;
    channelimageurl = null;
    channelimagedescription = null;
    channellanguage = null;
    channelauthor = null;
    createparentfolder = false;

View on GitHub (pinned to f3058517a1)