pentaho/pentaho-kettle · error · KettleXMLException
CubeOutputMeta.Exception.UnableToLoadStepInfo
CubeOutputMeta.Exception.UnableToLoadStepInfo
Error message
CubeOutputMeta.Exception.UnableToLoadStepInfo
What it means
CubeOutputMeta.readData parses the step's XML node (file name, add_to_result_filenames, do_not_open_newfile_init tags) when loading a transformation from a .ktr file. Any exception during XML parsing is wrapped in a KettleXMLException with message 'CubeOutputMeta.Exception.UnableToLoadStepInfo'. It means the Cube Output step's XML definition is malformed or missing required tags.
Solutions
- Open the .ktr in a text editor and check the Cube Output step's <file> XML block (file_name, add_to_result_filenames, do_not_open_newfile_init) for missing/malformed tags.
- Re-create the Cube Output step in Spoon and re-save the transformation.
- Restore the transformation from backup or version control.
- Compare the XML with a working transformation saved by the same PDI version and reconcile differences.
Example fix
// before: broken step XML
<step><name>Cube output</name><type>CubeOutput</type></step>
// after: complete file block
<step><name>Cube output</name><type>CubeOutput</type>
<file><file_name>file.cube</file_name>
<add_to_result_filenames>N</add_to_result_filenames>
<do_not_open_newfile_init>N</do_not_open_newfile_init>
</file>
</step> Defensive patterns
Strategy: validation
Validate before calling
// Validate the .ktr XML before loading
Document doc = XMLHandler.loadXMLFile(ktrFile);
if (XMLHandler.getSubNode(XMLHandler.getSubNode(doc, "transformation"), "step") == null) {
throw new KettleException("ktr file has no steps");
}
// ensure CubeOutput steps contain a <file> block
NodeList steps = doc.getElementsByTagName("step"); Try / catch
try { transMeta = new TransMeta(ktrPath); } catch (KettleXMLException e) { logError("Unable to load step info from " + ktrPath + ": " + e.getMessage(), e); transMeta = restoreFromBackup(ktrPath); } Prevention
- Do not hand-edit .ktr files; edit in Spoon.
- Commit transformations to version control so corrupted files can be restored.
- Verify file integrity (size/checksum) after transferring ktr files.
- Keep all PDI clients on the same version when sharing transformations.
When it happens
Trigger: loadXML -> readData on a <step> node whose <file> element is missing, has unexpected structure, or the XML document is truncated/corrupted so XMLHandler.getTagValue fails or returns invalid data.
Common situations: Hand-edited or corrupted .ktr files; ktr generated by another tool missing the <file> tags; version drift where an older/newer PDI wrote tags this reader does not expect; file truncated by a failed transfer.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- DelayMeta.Exception.UnableToReadStepInfo
- PGPDecryptStreamMeta.Exception.UnableToReadStepInfo
- RulesMeta.Error.LoadFromXML
- RulesMeta.Error.LoadFromXML
- Unable to read step information from XML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/4f12a4122062d849.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/cubeoutput/CubeOutputMeta.java:133
this.doNotOpenNewFileInit = doNotOpenNewFileInit;
}
public Object clone() {
CubeOutputMeta retval = (CubeOutputMeta) super.clone();
return retval;
}
private void readData( Node stepnode ) throws KettleXMLException {
try {
filename = XMLHandler.getTagValue( stepnode, "file", "name" );
addToResultFilenames =
"Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "file", "add_to_result_filenames" ) );
doNotOpenNewFileInit =
"Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "file", "do_not_open_newfile_init" ) );
} catch ( Exception e ) {
throw new KettleXMLException(
BaseMessages.getString( PKG, "CubeOutputMeta.Exception.UnableToLoadStepInfo" ), e );
}
}
public void setDefault() {
filename = "file.cube";
addToResultFilenames = false;
doNotOpenNewFileInit = false;
}
public String getXML() {
StringBuilder retval = new StringBuilder( 300 );
retval.append( " <file>" ).append( Const.CR );
retval.append( " " ).append( XMLHandler.addTagValue( "name", filename ) );
retval.append( " " ).append( XMLHandler.addTagValue( "add_to_result_filenames", addToResultFilenames ) );
retval.append( " " ).append( XMLHandler.addTagValue( "do_not_open_newfile_init", doNotOpenNewFileInit ) );
View on GitHub (pinned to f3058517a1)