{"record":{"id":"64279ad483d5e529","repo":"pentaho/pentaho-kettle","slug":"denormalisermeta-exception-unabletoloadstepinfofromxml","errorCode":"DenormaliserMeta.Exception.UnableToLoadStepInfoFromXML","errorMessage":"DenormaliserMeta.Exception.UnableToLoadStepInfoFromXML","messagePattern":"DenormaliserMeta\\.Exception\\.UnableToLoadStepInfoFromXML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/denormaliser/DenormaliserMeta.java","lineNumber":246,"sourceCode":"        denormaliserTargetField[i].setTargetName( XMLHandler.getTagValue( fnode, \"target_name\" ) );\n        denormaliserTargetField[i].setTargetType( XMLHandler.getTagValue( fnode, \"target_type\" ) );\n        denormaliserTargetField[i].setTargetFormat( XMLHandler.getTagValue( fnode, \"target_format\" ) );\n        denormaliserTargetField[i].setTargetLength( Const.toInt(\n          XMLHandler.getTagValue( fnode, \"target_length\" ), -1 ) );\n        denormaliserTargetField[i].setTargetPrecision( Const.toInt( XMLHandler.getTagValue(\n          fnode, \"target_precision\" ), -1 ) );\n        denormaliserTargetField[i]\n          .setTargetDecimalSymbol( XMLHandler.getTagValue( fnode, \"target_decimal_symbol\" ) );\n        denormaliserTargetField[i].setTargetGroupingSymbol( XMLHandler.getTagValue(\n          fnode, \"target_grouping_symbol\" ) );\n        denormaliserTargetField[i].setTargetCurrencySymbol( XMLHandler.getTagValue(\n          fnode, \"target_currency_symbol\" ) );\n        denormaliserTargetField[i].setTargetNullString( XMLHandler.getTagValue( fnode, \"target_null_string\" ) );\n        denormaliserTargetField[i].setTargetAggregationType( XMLHandler.getTagValue(\n          fnode, \"target_aggregation_type\" ) );\n      }\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString(\n        PKG, \"DenormaliserMeta.Exception.UnableToLoadStepInfoFromXML\" ), e );\n    }\n  }\n\n  public String getXML() {\n    StringBuilder retval = new StringBuilder();\n\n    retval.append( \"      \" + XMLHandler.addTagValue( \"key_field\", keyField ) );\n\n    retval.append( \"      <group>\" + Const.CR );\n    for ( int i = 0; i < groupField.length; i++ ) {\n      retval.append( \"        <field>\" + Const.CR );\n      retval.append( \"          \" + XMLHandler.addTagValue( \"name\", groupField[i] ) );\n      retval.append( \"          </field>\" + Const.CR );\n    }\n    retval.append( \"        </group>\" + Const.CR );\n\n    retval.append( \"      <fields>\" + Const.CR );","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/denormaliser/DenormaliserMeta.java#L228-L264","documentation":"DenormaliserMeta.loadXML reads the step's configuration from the .ktr XML via readData. Any exception while parsing the <denormaliser> block (target field nodes, aggregation types, etc.) is wrapped in a KettleXMLException with this generic message and the original cause preserved.","triggerScenarios":"loadXML -> readData hits an Exception while reading denormaliserTargetField nodes via XMLHandler.getTagValue (missing nodes, malformed XML, incompatible attributes).","commonSituations":"Hand-edited or truncated .ktr file; XML produced by a different Pentaho version with a changed schema; corrupted save; copy-pasted step XML missing required child nodes.","solutions":["Inspect the cause chain of the KettleXMLException for the exact parse failure.","Validate the .ktr XML and confirm the denormaliser step block contains complete target field nodes.","Recreate the Denormaliser step in Spoon and re-save the transformation to regenerate valid XML.","Open and re-save the file in the same Pentaho version it will run under."],"exampleFix":"// before (truncated node)\n<field><field_name>amount</field_name>\n// after (complete node)\n<field><field_name>amount</field_name><target_aggregation_type>SUM</target_aggregation_type>...</field>","handlingStrategy":"try-catch","validationCode":"// Validate XML well-formedness before loading\nDocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(ktrPath));","typeGuard":null,"tryCatchPattern":"try { denormMeta.loadXML(node, databases, metaStore); } catch (KettleXMLException e) {\n  log.error(\"Denormaliser XML load failed: {}\", e.getCause(), e);\n}","preventionTips":["Edit transformations only through Spoon, never by hand-editing XML.","Version-control .ktr files to detect corruption quickly.","Re-save transformations when migrating between Pentaho versions.","Check the cause chain to locate the malformed node."],"tags":["xml","kettle-metadata","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"}