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
- Validate the .ktr file is well-formed XML and inspect the <step type="RssOutput"> block for malformed or missing tags.
- Restore the transformation from version control or a backup copy.
- Recreate the RSS Output step in Spoon and re-enter its settings, replacing the corrupt step XML.
- 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
- Never hand-edit .ktr files; edit via Spoon only
- Store transformations in version control and restore on merge conflicts
- Keep the RSS plugin and Pentaho versions aligned across environments
- Validate .ktr XML structure in CI before deploying
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
- Error adding item to feed
- RssOutput.Exception.FieldRequired
- RssOutput.Log.GeoPointLatEmpty
- RssOutput.Log.GeoPointLongEmpty
- RssOutput.Meta.ErrorGettingFile
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)