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

  1. Open the .ktr in an XML editor and validate it; fix malformed If Null step XML (note the typo message text)
  2. Recreate the If Null step in Spoon and save a fresh .ktr
  3. Check version compatibility between the file's producer and your PDI version
  4. 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

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


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)