pentaho/pentaho-kettle · error · KettleXMLException
It was not possibke to load the IfNull metadata from XML
Error message
It was not possibke to load the IfNull metadata from XML
What it means
IfNullMeta.readData() parses the step's XML via XMLHandler and wraps any parsing exception in a KettleXMLException with this (typo'd, hardcoded) message. It means the If Null step's XML fragment could not be read, so the step configuration from the .ktr file is unavailable.
Solutions
- Open the .ktr in an XML editor and validate it; fix malformed If Null step XML (note the typo message text)
- Recreate the If Null step in Spoon and save a fresh .ktr
- Check version compatibility between the file's producer and your PDI version
- Restore the file from a backup or version control
Example fix
// before (hand-edited XML) <fields><field_name>x</field_name></fields> // after (correct structure) <fields><field><name>x</name><value>y</value><mask></mask></field></fields>
Defensive patterns
Strategy: try-catch
Validate before calling
try { XMLHandler.loadXMLFile(inputStream); } catch (Exception e) { throw new IOException("Invalid XML: " + e.getMessage(), e); } Type guard
boolean isParsableXml(String xml) { try { XMLHandler.loadXMLString(xml); return true; } catch (Exception e) { return false; } } Try / catch
try { TransMeta tm = new TransMeta(inputStream); } catch (KettleXMLException e) { logger.error("XML load failed: " + e.getCause(), e); } Prevention
- Don't hand-edit .ktr files
- Keep transformation files in version control
- Validate XML produced by external tools before loading
When it happens
Trigger: loadXML -> readData throwing inside tag parsing: malformed XML, missing/renamed tags (e.g. 'field' nodes), wrong node types, or XMLHandler.getTagValue returning unexpected structures.
Common situations: .ktr file hand-edited and malformed; transformation file produced by a newer/older Kettle version with changed tag names; truncated/corrupted file transfer; XML with invalid encoding.
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
- ColumnExistsMeta.Exception.UnableToReadStepInfo
- CreditCardValidatorMeta.Exception.UnableToReadStepInfo
- CubeOutputMeta.Exception.UnableToLoadStepInfo
- DelayMeta.Exception.UnableToReadStepInfo
- DynamicSQLRowMeta.Exception.UnableToLoadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/969d9d3ae5af09a6.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/ifnull/IfNullMeta.java:322
for ( int i = 0; i < nrtypes; i++ ) {
Node tnode = XMLHandler.getSubNodeByNr( types, "valuetype", i );
valueTypes[i].setTypeName( XMLHandler.getTagValue( tnode, "name" ) );
valueTypes[i].setTypereplaceValue( XMLHandler.getTagValue( tnode, "value" ) );
valueTypes[i].setTypereplaceMask( XMLHandler.getTagValue( tnode, "mask" ) );
String typeemptyString = XMLHandler.getTagValue( tnode, "set_type_empty_string" );
valueTypes[i].setTypeEmptyString( !Utils.isEmpty( typeemptyString ) && "Y".equalsIgnoreCase(
typeemptyString ) );
}
for ( int i = 0; i < nrfields; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( fieldNodes, "field", i );
fields[i].setFieldName( XMLHandler.getTagValue( fnode, "name" ) );
fields[i].setReplaceValue( XMLHandler.getTagValue( fnode, "value" ) );
fields[i].setReplaceMask( XMLHandler.getTagValue( fnode, "mask" ) );
String emptyString = XMLHandler.getTagValue( fnode, "set_empty_string" );
fields[i].setEmptyString( !Utils.isEmpty( emptyString ) && "Y".equalsIgnoreCase( emptyString ) );
}
} catch ( Exception e ) {
throw new KettleXMLException( "It was not possibke to load the IfNull metadata from XML", e );
}
}
public String getXML() {
StringBuilder retval = new StringBuilder();
retval.append( " " + XMLHandler.addTagValue( "replaceAllByValue", replaceAllByValue ) );
retval.append( " " + XMLHandler.addTagValue( "replaceAllMask", replaceAllMask ) );
retval.append( " " + XMLHandler.addTagValue( "selectFields", selectFields ) );
retval.append( " " + XMLHandler.addTagValue( "selectValuesType", selectValuesType ) );
retval.append( " " + XMLHandler.addTagValue( "setEmptyStringAll", setEmptyStringAll ) );
retval.append( " <valuetypes>" + Const.CR );
for ( int i = 0; i < valueTypes.length; i++ ) {
retval.append( " <valuetype>" + Const.CR );
retval.append( " " + XMLHandler.addTagValue( "name", valueTypes[i].getTypeName() ) );
retval.append( " " + XMLHandler.addTagValue( "value", valueTypes[i].getTypereplaceValue() ) );
retval.append( " " + XMLHandler.addTagValue( "mask", valueTypes[i].getTypereplaceMask() ) );View on GitHub (pinned to f3058517a1)