{"record":{"id":"899cbcd5884e5639","repo":"pentaho/pentaho-kettle","slug":"normalisermeta-exception-unabletoloadstepinfofromxml","errorCode":"NormaliserMeta.Exception.UnableToLoadStepInfoFromXML","errorMessage":"NormaliserMeta.Exception.UnableToLoadStepInfoFromXML","messagePattern":"NormaliserMeta\\.Exception\\.UnableToLoadStepInfoFromXML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/normaliser/NormaliserMeta.java","lineNumber":172,"sourceCode":"\n  private void readData( Node stepnode ) throws KettleXMLException {\n    try {\n      typeField = XMLHandler.getTagValue( stepnode, \"typefield\" );\n\n      Node fields = XMLHandler.getSubNode( stepnode, \"fields\" );\n      int nrfields = XMLHandler.countNodes( fields, \"field\" );\n\n      allocate( nrfields );\n\n      for ( int i = 0; i < nrfields; i++ ) {\n        Node fnode = XMLHandler.getSubNodeByNr( fields, \"field\", i );\n\n        normaliserFields[i].setName( XMLHandler.getTagValue( fnode, \"name\" ) );\n        normaliserFields[i].setValue( XMLHandler.getTagValue( fnode, \"value\" ) );\n        normaliserFields[i].setNorm( XMLHandler.getTagValue( fnode, \"norm\" ) );\n      }\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG,\n          \"NormaliserMeta.Exception.UnableToLoadStepInfoFromXML\" ), e );\n    }\n  }\n\n  @Override\n  public void setDefault() {\n    typeField = \"typefield\";\n\n    int nrfields = 0;\n\n    allocate( nrfields );\n\n    for ( int i = 0; i < nrfields; i++ ) {\n      normaliserFields[i].setName( \"field\" + i );\n      normaliserFields[i].setValue( \"value\" + i );\n      normaliserFields[i].setNorm( \"value\" + i );\n    }\n  }","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/normaliser/NormaliserMeta.java#L154-L190","documentation":"Thrown by NormaliserMeta.readData (invoked from loadXML) when an exception occurs while parsing the Normaliser step's XML, specifically while reading each field node's \"name\", \"value\", and \"norm\" tags into normaliserFields. It wraps the cause in a KettleXMLException identifying the step as the one that failed to load.","triggerScenarios":"Loading a .ktr whose Normaliser step XML is malformed or structurally unexpected: corrupted <field> nodes, mismatched tags, hand-edited XML, or a document layout from an incompatible PDI version causing XMLHandler.getTagValue parsing to throw.","commonSituations":"Hand-edited or truncated .ktr files; XML produced by a different PDI version; copy-paste of step XML that breaks nesting; file corruption during transfer or storage.","solutions":["Open the .ktr in an XML editor and inspect the Normaliser step node for malformed <field> elements (name/value/norm tags).","Read the wrapped cause for the exact parse error and location.","Re-create the Normaliser step in Spoon, re-enter its fields, and save a fresh transformation file.","Verify version compatibility between the file's producer and your PDI installation."],"exampleFix":"// before (broken field node)\n<field>\n  <name>amount<name>\n  <norm>NORM_AMOUNT\n</field>\n\n// after (well-formed)\n<field>\n  <name>amount</name>\n  <value>value</value>\n  <norm>NORM_AMOUNT</norm>\n</field>","handlingStrategy":"try-catch","validationCode":"// Validate the .ktr XML parses before loading\nDocumentBuilderFactory f = DocumentBuilderFactory.newInstance();\nf.newDocumentBuilder().parse( new File( ktrPath ) ); // throws on malformed XML","typeGuard":null,"tryCatchPattern":"try {\n  TransMeta tm = new TransMeta( ktrPath );\n} catch ( KettleXMLException e ) {\n  if ( e.getMessage().contains( \"UnableToLoadStepInfoFromXML\" ) ) {\n    // inspect e.getCause(); repair the Normaliser step XML or recreate the step\n  } else { throw e; }\n}","preventionTips":["Edit Normaliser fields via Spoon, not by hand-editing XML.","Version-control .ktr files to recover from corrupted edits.","Align PDI versions between environments that share transformation files.","Run an XML well-formedness check after any automated .ktr manipulation."],"tags":["kettle","xml","deserialization","normaliser","metadata"],"backgroundTag":"xml-parse-failed","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"}