{"record":{"id":"6ae276f132908556","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-step-info-from-xml-elasticsearchbulkmeta","errorCode":null,"errorMessage":"Unable to load step info from XML","messagePattern":"Unable to load step info from XML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulkMeta.java","lineNumber":461,"sourceCode":"        }\n        this.addServer( addr, port );\n      }\n\n      // Settings\n      Node settings = XMLHandler.getSubNode( stepnode, Dom.TAG_SETTINGS );\n      int nrSettings = XMLHandler.countNodes( settings, Dom.TAG_SETTING );\n      this.clearSettings();\n      for ( int i = 0; i < nrSettings; i++ ) {\n        Node sNode = XMLHandler.getSubNodeByNr( settings, Dom.TAG_SETTING, i );\n\n        String name = XMLHandler.getTagValue( sNode, Dom.TAG_SETTING_NAME );\n        String value = XMLHandler.getTagValue( sNode, Dom.TAG_SETTING_VALUE );\n\n        this.addSetting( name, value );\n      }\n\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"Unable to load step info from XML\", e );\n    }\n  }\n\n  private static boolean parseBool( String val ) {\n    return \"Y\".equals( val );\n  }\n\n  public String getXML() {\n    StringBuffer retval = new StringBuffer();\n    Indentation indent = new Indentation();\n\n    indent.incr().incr();\n\n    // General\n    retval.append( indent.toString() ).append( XMLHandler.openTag( Dom.TAG_GENERAL ) ).append( Const.CR );\n    indent.incr();\n\n    retval.append( indent.toString() + XMLHandler.addTagValue( Dom.TAG_INDEX, getIndex() ) );","sourceCodeStart":443,"sourceCodeEnd":479,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/elasticsearch-bulk-insert/core/src/main/java/org/pentaho/di/trans/steps/elasticsearchbulk/ElasticSearchBulkMeta.java#L443-L479","documentation":"ElasticSearchBulkMeta.loadXML() parses the step's XML node (settings, servers, etc.) with XMLHandler; any exception during parsing is wrapped in a KettleXMLException with the literal message 'Unable to load step info from XML'. It indicates the saved transformation XML for this step is malformed or missing expected tags.","triggerScenarios":"loadXML (public StepMetaInterface method) called while opening/loading a .ktr: XMLHandler.getTagValue returns unexpected structure or throws because a required node is absent or the XML is corrupted.","commonSituations":"Hand-edited or truncated .ktr file, transformation saved by a newer plugin version then opened with an older one, copy-pasted step XML missing <settings> child nodes.","solutions":["Open the .ktr in a text editor and validate the XML well-formedness and the step's <settings> block","Recreate the step in Spoon and re-save the transformation","Align plugin versions — open with the same or newer Pentaho/plugin version that wrote the file"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// validate the .ktr XML before loading it in Pentaho\nxmllint --noout transformation.ktr && echo OK\n// check the step node contains a <settings> element:\ngrep -c '<settings>' transformation.ktr","typeGuard":null,"tryCatchPattern":"try { transMeta = TransMetaFactory.create(path, rep); } catch (KettleXMLException e) {\n  log.error(\"Corrupt step XML: \" + e.getMessage(), e);\n  throw new IOException(\"Fix or regenerate the .ktr file\", e);\n}","preventionTips":["Never hand-edit .ktr/.kjb files without validating XML afterwards","Keep Pentaho and plugin versions consistent across environments","Keep transformations under version control so corrupted files are recoverable"],"tags":["kettle","xml","serialization","metadata"],"backgroundTag":"xml-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"}