pentaho/pentaho-kettle · error · KettleXMLException
Unable to load step info from XML
Error message
Unable to load step info from XML
What it means
ExcelOutputMeta.loadXML parses the step's custom XML node (fonts, colors, etc.) and wraps any parsing failure in this KettleXMLException. It means the <step> XML for an Excel Output step could not be read — typically a malformed or unexpected XML structure in the .ktr file.
Solutions
- Inspect the wrapped cause to find which tag or value failed to parse.
- Open the .ktr in Spoon and re-save the Excel Output step to regenerate canonical XML.
- Compare the step's XML against a freshly created Excel Output step and fix mismatched/missing tags.
- Confirm the PDI version that wrote the .ktr matches the runtime version; migrate via Spoon rather than manual edits.
- Check that font/color code values in the XML are valid integers recognized by getFontColorByCode.
Example fix
// before: hand-edited tag with invalid value <row_font_color>dark</row_font_color> // after: valid numeric color code <row_font_color>0</row_font_color>
Defensive patterns
Strategy: try-catch
Validate before calling
Document doc = XMLHandler.loadXMLFile( new File( ktrPath ) ); // validate Excel Output custom tags exist before loading Node stepNode = XMLHandler.getSubNode( doc, "step" ); if ( stepNode == null ) throw new IllegalStateException( "Malformed Excel Output XML" );
Try / catch
try { transMeta.loadXML( file, ... ); } catch ( KettleXMLException e ) { logError( "Excel Output XML invalid: " + e.getCause(), e ); } Prevention
- Never hand-edit .ktr XML; edit through Spoon.
- Keep the PDI version that produced the .ktr aligned with the runtime version.
- Version-control transformations so corrupted XML can be reverted.
When it happens
Trigger: The constructor/loadXML path hits an exception while calling XMLHandler.getTagValue on the custom node (e.g. node is null, wrong element names, invalid numeric color/font codes passed to getFontColorByCode).
Common situations: Hand-edited .ktr files; .ktr produced by a newer/older PDI version with a different XML schema; corrupted copy/paste of step XML between transformations; missing 'custom' node attributes.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- FuzzyMatchMeta.Exception.UnableToLoadStepInfoFromXML
- GetXMLDataMeta.Exception.ErrorLoadingXML (localized message…
- AddSequenceMeta.Exception.ErrorLoadingStepInfo
- AnalyticQueryMeta.Exception.UnableToLoadStepInfoFromXML
- ChangeFileEncodingMeta.Exception.UnableToReadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/17975665e9b31590.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/excel/core/src/main/java/org/pentaho/di/trans/steps/exceloutput/ExcelOutputMeta.java:899
header_background_color =
getFontColorByCode( Const.NVL( XMLHandler.getTagValue( customnode, "header_background_color" ), ""
+ FONT_COLOR_NONE ) );
header_row_height = XMLHandler.getTagValue( customnode, "header_row_height" );
header_alignment =
getFontAlignmentByCode( Const.NVL( XMLHandler.getTagValue( customnode, "header_alignment" ), "" ) );
header_image = XMLHandler.getTagValue( customnode, "header_image" );
// Row font
row_font_name = getFontNameByCode( Const.NVL( XMLHandler.getTagValue( customnode, "row_font_name" ), "" ) );
row_font_size = Const.NVL( XMLHandler.getTagValue( customnode, "row_font_size" ), "" + DEFAULT_FONT_SIZE );
row_font_color =
getFontColorByCode( Const.NVL( XMLHandler.getTagValue( customnode, "row_font_color" ), ""
+ FONT_COLOR_BLACK ) );
row_background_color =
getFontColorByCode( Const.NVL( XMLHandler.getTagValue( customnode, "row_background_color" ), ""
+ FONT_COLOR_NONE ) );
} catch ( Exception e ) {
throw new KettleXMLException( "Unable to load step info from XML", e );
}
}
public String getNewLine( String fformat ) {
String nl = System.getProperty( "line.separator" );
if ( fformat != null ) {
if ( fformat.equalsIgnoreCase( "DOS" ) ) {
nl = "\r\n";
} else if ( fformat.equalsIgnoreCase( "UNIX" ) ) {
nl = "\n";
}
}
return nl;
}
@OverrideView on GitHub (pinned to f3058517a1)