{"record":{"id":"969d9d3ae5af09a6","repo":"pentaho/pentaho-kettle","slug":"it-was-not-possibke-to-load-the-ifnull-metadata-from-xml","errorCode":null,"errorMessage":"It was not possibke to load the IfNull metadata from XML","messagePattern":"It was not possibke to load the IfNull metadata from XML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/ifnull/IfNullMeta.java","lineNumber":322,"sourceCode":"      for ( int i = 0; i < nrtypes; i++ ) {\n        Node tnode = XMLHandler.getSubNodeByNr( types, \"valuetype\", i );\n        valueTypes[i].setTypeName( XMLHandler.getTagValue( tnode, \"name\" ) );\n        valueTypes[i].setTypereplaceValue( XMLHandler.getTagValue( tnode, \"value\" ) );\n        valueTypes[i].setTypereplaceMask( XMLHandler.getTagValue( tnode, \"mask\" ) );\n        String typeemptyString = XMLHandler.getTagValue( tnode, \"set_type_empty_string\" );\n        valueTypes[i].setTypeEmptyString( !Utils.isEmpty( typeemptyString ) && \"Y\".equalsIgnoreCase(\n            typeemptyString ) );\n      }\n      for ( int i = 0; i < nrfields; i++ ) {\n        Node fnode = XMLHandler.getSubNodeByNr( fieldNodes, \"field\", i );\n        fields[i].setFieldName( XMLHandler.getTagValue( fnode, \"name\" ) );\n        fields[i].setReplaceValue( XMLHandler.getTagValue( fnode, \"value\" ) );\n        fields[i].setReplaceMask( XMLHandler.getTagValue( fnode, \"mask\" ) );\n        String emptyString = XMLHandler.getTagValue( fnode, \"set_empty_string\" );\n        fields[i].setEmptyString( !Utils.isEmpty( emptyString ) && \"Y\".equalsIgnoreCase( emptyString ) );\n      }\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"It was not possibke to load the IfNull metadata from XML\", e );\n    }\n  }\n\n  public String getXML() {\n    StringBuilder retval = new StringBuilder();\n\n    retval.append( \"      \" + XMLHandler.addTagValue( \"replaceAllByValue\", replaceAllByValue ) );\n    retval.append( \"      \" + XMLHandler.addTagValue( \"replaceAllMask\", replaceAllMask ) );\n    retval.append( \"      \" + XMLHandler.addTagValue( \"selectFields\", selectFields ) );\n    retval.append( \"      \" + XMLHandler.addTagValue( \"selectValuesType\", selectValuesType ) );\n    retval.append( \"      \" + XMLHandler.addTagValue( \"setEmptyStringAll\", setEmptyStringAll ) );\n\n    retval.append( \"    <valuetypes>\" + Const.CR );\n    for ( int i = 0; i < valueTypes.length; i++ ) {\n      retval.append( \"      <valuetype>\" + Const.CR );\n      retval.append( \"        \" + XMLHandler.addTagValue( \"name\", valueTypes[i].getTypeName() ) );\n      retval.append( \"        \" + XMLHandler.addTagValue( \"value\", valueTypes[i].getTypereplaceValue() ) );\n      retval.append( \"        \" + XMLHandler.addTagValue( \"mask\", valueTypes[i].getTypereplaceMask() ) );","sourceCodeStart":304,"sourceCodeEnd":340,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/ifnull/IfNullMeta.java#L304-L340","documentation":"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.","triggerScenarios":"loadXML -> readData throwing inside tag parsing: malformed XML, missing/renamed tags (e.g. 'field' nodes), wrong node types, or XMLHandler.getTagValue returning unexpected structures.","commonSituations":".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.","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"],"exampleFix":"// before (hand-edited XML)\n<fields><field_name>x</field_name></fields>\n// after (correct structure)\n<fields><field><name>x</name><value>y</value><mask></mask></field></fields>","handlingStrategy":"try-catch","validationCode":"try { XMLHandler.loadXMLFile(inputStream); } catch (Exception e) { throw new IOException(\"Invalid XML: \" + e.getMessage(), e); }","typeGuard":"boolean isParsableXml(String xml) { try { XMLHandler.loadXMLString(xml); return true; } catch (Exception e) { return false; } }","tryCatchPattern":"try { TransMeta tm = new TransMeta(inputStream); } catch (KettleXMLException e) { logger.error(\"XML load failed: \" + e.getCause(), e); }","preventionTips":["Don't hand-edit .ktr files","Keep transformation files in version control","Validate XML produced by external tools before loading"],"tags":["kettle","xml","deserialization"],"backgroundTag":"json-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}