{"record":{"id":"b88b3a3e99d5d954","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-step-info-from-xml-propertyoutputmeta","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":"engine/src/main/java/org/pentaho/di/trans/steps/propertyoutput/PropertyOutputMeta.java","lineNumber":364,"sourceCode":"      comment = XMLHandler.getTagValue( stepnode, \"comment\" );\n\n      fileName = XMLHandler.getTagValue( stepnode, \"file\", \"name\" );\n\n      createparentfolder =\n        \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"create_parent_folder\" ) );\n      extension = XMLHandler.getTagValue( stepnode, \"file\", \"extention\" );\n      stepNrInFilename = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"split\" ) );\n      partNrInFilename = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"haspartno\" ) );\n      dateInFilename = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"add_date\" ) );\n      timeInFilename = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"add_time\" ) );\n      addToResult = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"AddToResult\" ) );\n      append = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"file\", \"append\" ) );\n      fileName = XMLHandler.getTagValue( stepnode, \"file\", \"name\" );\n      fileNameInField = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"fileNameInField\" ) );\n      fileNameField = XMLHandler.getTagValue( stepnode, \"fileNameField\" );\n\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"Unable to load step info from XML\", e );\n    }\n  }\n\n  @Override\n  public void setDefault() {\n    append = false;\n    createparentfolder = false;\n    // Items ...\n    keyfield = null;\n    valuefield = null;\n    comment = null;\n  }\n\n  @Override\n  public String getXML() {\n    StringBuilder retval = new StringBuilder();\n\n    // Items ...","sourceCodeStart":346,"sourceCodeEnd":382,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/propertyoutput/PropertyOutputMeta.java#L346-L382","documentation":"PropertyOutputMeta.readData parses the step's XML node with XMLHandler.getTagValue calls and wraps any parsing exception in a KettleXMLException with message \"Unable to load step info from XML\". This happens while deserializing a transformation (.ktr) that contains a Property Output step, e.g. when loading a saved transformation or a repository import. The cause carries the underlying XML handling error.","triggerScenarios":"loadXML invokes readData(stepnode); an Exception occurs in XMLHandler.getTagValue lookups (malformed or missing stepnode structure, wrong node type, corrupt transformation file, incompatible XML produced by a different plugin version).","commonSituations":"Hand-edited or truncated .ktr file; transformation produced by a newer/older Pentaho version with a changed XML schema; copy-pasting step XML between transformations with mismatched node structure; corrupted repository export.","solutions":["Open the .ktr file in a text editor and verify the Property Output step's <fields> and <file> XML blocks are well-formed.","Recreate the Property Output step in Spoon and re-save the transformation.","Check Pentaho/PDI version compatibility between the file's producer and your runtime.","Inspect the chained cause of the KettleXMLException for the precise XMLHandler failure."],"exampleFix":"// before (broken step XML)\n<file><name>/data/out.properties</name> <!-- missing </file> close or wrong nesting -->\n// after\n<file><name>/data/out.properties</name><append>N</append></file>","handlingStrategy":"try-catch","validationCode":"// validate the .ktr before loading\nDocument doc = XMLHandler.loadXMLFile(new File(ktrPath));\nif (XMLHandler.getSubNode(doc, \"transformation\") == null) {\n    throw new IllegalArgumentException(ktrPath + \" is not a valid transformation file\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    transMeta = new TransMeta(ktrPath, metaStore);\n} catch (KettleXMLException e) {\n    Throwable root = e;\n    while (root.getCause() != null) root = root.getCause();\n    logError(\"Bad transformation XML: \" + root.getMessage());\n}","preventionTips":["Do not hand-edit .ktr files; edit in Spoon only.","Keep PDI runtime and designer versions consistent with transformation files.","Validate repository exports after migration between PDI versions."],"tags":["pentaho-kettle","xml","deserialization","ktr"],"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"}