{"record":{"id":"267b6ed5b2450f6d","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-ftpput-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'FTPPUT' from XML node","messagePattern":"Unable to load job entry of type 'FTPPUT' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/put-a-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftpput/JobEntryFTPPUT.java","lineNumber":235,"sourceCode":"\n      proxyHost = XMLHandler.getTagValue( entrynode, XML_TAG_PROXY_HOST );\n      proxyPort = XMLHandler.getTagValue( entrynode, XML_TAG_PROXY_PORT );\n      proxyUsername = XMLHandler.getTagValue( entrynode, XML_TAG_PROXY_USERNAME );\n      proxyPassword =\n        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, XML_TAG_PROXY_PASSWORD ) );\n      socksProxyHost = XMLHandler.getTagValue( entrynode, XML_TAG_SOCKSPROXY_HOST );\n      socksProxyPort = XMLHandler.getTagValue( entrynode, XML_TAG_SOCKSPROXY_PORT );\n      socksProxyUsername = XMLHandler.getTagValue( entrynode, XML_TAG_SOCKSPROXY_USERNAME );\n      socksProxyPassword =\n        Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, XML_TAG_SOCKSPROXY_PASSWORD ) );\n\n      if ( controlEncoding == null ) {\n        // if we couldn't retrieve an encoding, assume it's an old instance and\n        // put in the the encoding used before v 2.4.0\n        controlEncoding = LEGACY_CONTROL_ENCODING;\n      }\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"JobFTPPUT.Log.UnableToLoadFromXml\" ), xe );\n    }\n  }\n\n  @Override\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId jobEntryId, List<DatabaseMeta> databases,\n                       List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      serverName = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_SERVERNAME );\n      serverPort = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_SERVERPORT );\n      userName = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_USERNAME );\n      password =\n        Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( jobEntryId, XML_TAG_PASSWORD ) );\n      remoteDirectory = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_REMOTE_DIRECTORY );\n      localDirectory = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_LOCAL_DIRECTORY );\n      wildcard = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_WILDCARD );\n      binaryMode = rep.getJobEntryAttributeBoolean( jobEntryId, XML_TAG_BINARY );\n      timeout = rep.getJobEntryAttributeString( jobEntryId, XML_TAG_TIMEOUT );\n      remove = rep.getJobEntryAttributeBoolean( jobEntryId, XML_TAG_REMOVE );","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/put-a-file-with-ftp/impl/src/main/java/org/pentaho/di/job/entries/ftpput/JobEntryFTPPUT.java#L217-L253","documentation":"JobEntryFTPPUT.loadXML wraps any KettleXMLException raised while parsing the job entry's XML node and rethrows it as 'Unable to load job entry of type FTPPUT from XML node'. This means the FTP Put job entry could not be deserialized from the .kjb XML document.","triggerScenarios":"Calling loadXML with a malformed or missing FTPPUT XML node — e.g. XMLHandler.getTagValue hitting an unexpected structure, a corrupted <entry> block, or an XML node for a different entry type passed to this loader.","commonSituations":"Hand-edited or truncated .kjb files; .kjb files from newer/older Pentaho versions with renamed tags; copy-paste corruption of job XML; loading a job saved by a different tool.","solutions":["Open the .kjb file in a text editor and verify the FTPPUT entry XML block is well-formed with all expected tags.","Check the chained cause (xe) in the log to identify the exact XML parse failure.","Recreate the FTP Put job entry in Spoon and re-save the job to regenerate valid XML.","Verify the file was not produced by an incompatible Kettle version; re-export from the original tool if needed."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"Document doc = XMLHandler.loadXMLFile(xmlInputStream); Node entry = XMLHandler.getSubNode(doc, \"entry\"); if (entry == null) throw new IllegalArgumentException(\"Missing <entry> node for FTPPUT\");","typeGuard":null,"tryCatchPattern":"try { entry.loadXML(node, databases, slaveServers, rep, metaStore); } catch (KettleXMLException e) { log.error(\"FTPPUT XML load failed: \" + e.getCause(), e); }","preventionTips":["Never hand-edit .kjb files; use Spoon to modify job entries.","Validate .kjb files in CI with a schema/round-trip load test.","Keep source and target Pentaho versions compatible when migrating jobs."],"tags":["xml","job-entry","ftp","deserialization"],"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"}