{"record":{"id":"852ae50518465c6e","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-create-file-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'create file' from XML node","messagePattern":"Unable to load job entry of type 'create file' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/createfile/JobEntryCreateFile.java","lineNumber":102,"sourceCode":"    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"filename\", filename ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"fail_if_file_exists\", failIfFileExists ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"add_filename_result\", addfilenameresult ) );\n    if ( parentJobMeta != null ) {\n      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename );\n    }\n    return retval.toString();\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,\n    Repository rep, IMetaStore metaStore ) throws KettleXMLException {\n    try {\n      super.loadXML( entrynode, databases, slaveServers );\n      filename = XMLHandler.getTagValue( entrynode, \"filename\" );\n      failIfFileExists = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"fail_if_file_exists\" ) );\n      addfilenameresult = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"add_filename_result\" ) );\n\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'create file' from XML node\", xe );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n    List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      filename = rep.getJobEntryAttributeString( id_jobentry, \"filename\" );\n      failIfFileExists = rep.getJobEntryAttributeBoolean( id_jobentry, \"fail_if_file_exists\" );\n      addfilenameresult = rep.getJobEntryAttributeBoolean( id_jobentry, \"add_filename_result\" );\n\n    } catch ( KettleException dbe ) {\n      throw new KettleException(\n        \"Unable to load job entry of type 'create file' from the repository for id_jobentry=\" + id_jobentry, dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {\n    try {","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/createfile/JobEntryCreateFile.java#L84-L120","documentation":"JobEntryCreateFile.loadXML throws this KettleXMLException with a hard-coded message when the XML node for the 'create file' job entry cannot be parsed. The original KettleXMLException is chained as the cause so the real parse failure remains accessible.","triggerScenarios":"Calling loadXML on a 'create file' entry node whose 'filename', 'fail_if_file_exists' or 'add_filename_result' tags cause XMLHandler to fail — malformed XML, missing entrynode attributes, or non-element nodes.","commonSituations":"Hand-edited .kjb files; truncation during file transfer; jobs generated by scripts emitting invalid XML; opening jobs from incompatible Pentaho versions.","solutions":["Validate the entry XML is well-formed and contains <filename>, <fail_if_file_exists>, <add_filename_result> tags.","Check getCause() on the thrown KettleXMLException for the exact parse error.","Recreate the entry in Spoon and re-save the job file.","Regenerate the job file from source control rather than manual edits."],"exampleFix":"// before (malformed)\n<filename>/tmp/x.txt<filename>\n// after\n<filename>/tmp/x.txt</filename>","handlingStrategy":"try-catch","validationCode":"Node fn = XMLHandler.getSubNode(entrynode, \"filename\");\nif (fn == null) throw new IllegalArgumentException(\"create file entry missing <filename> tag\");","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.loadXML(entrynode, databases, slaveServers);\n} catch (KettleXMLException e) {\n  logError(\"Bad 'create file' entry XML: \" + e.getCause(), e);\n  // skip or rebuild this entry instead of failing the whole job load\n}","preventionTips":["Edit jobs only through Spoon, not text editors","Validate .kjb XML well-formedness before programmatic loading","Check getCause() to find the exact XML parse error","Store job files in version control for recovery"],"tags":["pdi","kettle","xml-parse","job-entry"],"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"}