{"record":{"id":"8b96ea5c4b7b4c36","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-base-info-for-job-entry","errorCode":null,"errorMessage":"Unable to load base info for job entry","messagePattern":"Unable to load base info for job entry","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entry/JobEntryBase.java","lineNumber":444,"sourceCode":"   *          the top-level XML node\n   * @param databases\n   *          the list of databases\n   * @param slaveServers\n   *          the list of slave servers\n   * @throws KettleXMLException\n   *           if any errors occur during the loading of the XML\n   */\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers ) throws KettleXMLException {\n    try {\n      setName( XMLHandler.getTagValue( entrynode, \"name\" ) );\n      setDescription( XMLHandler.getTagValue( entrynode, \"description\" ) );\n\n      // Load the attribute groups map\n      //\n      attributesMap = AttributesUtil.loadAttributes( XMLHandler.getSubNode( entrynode, AttributesUtil.XML_TAG ) );\n\n    } catch ( Exception e ) {\n      throw new KettleXMLException( \"Unable to load base info for job entry\", e );\n    }\n  }\n\n  /**\n   * @deprecated use {@link #loadXML(Node, List, List, Repository, IMetaStore)}\n   * @param entrynode\n   * @param databases\n   * @param slaveServers\n   * @param repository\n   * @throws KettleXMLException\n   */\n  @Deprecated\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,\n    Repository repository ) throws KettleXMLException {\n    // Provided for compatibility with v4 code\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,","sourceCodeStart":426,"sourceCodeEnd":462,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entry/JobEntryBase.java#L426-L462","documentation":"JobEntryBase.loadXML() throws this KettleXMLException when loading the job entry's base information fails — most notably when AttributesUtil.loadAttributes cannot parse the <attributes> group node. The generic message hides the specific failure, which is available via getCause().","triggerScenarios":"Calling loadXML on a job entry node whose <attributes> subtree is malformed or whose attribute entries fail to parse, or any other Exception thrown during base-info loading.","commonSituations":"Hand-edited .kjb files with corrupted <attributes> sections; job files generated by third-party tools with invalid attribute-group XML; version mismatch where attribute XML format changed between PDI releases.","solutions":["Inspect getCause() on the KettleXMLException for the exact failure inside AttributesUtil.loadAttributes","Fix or remove the malformed <attributes> node in the .kjb file (back it up first)","Re-create/re-save the job entry in Spoon to regenerate valid base XML","If migrating between PDI versions, re-export the job from the source version or run migration tooling"],"exampleFix":"// before: malformed attributes node\n<attributes><group key=\"a\"><entry><unclosed></group></attributes>\n// after: well-formed\n<attributes><group key=\"a\"><entry key=\"x\">1</entry></group></attributes>","handlingStrategy":"try-catch","validationCode":"// validate the attributes subtree before loadXML\nNode attrs = XMLHandler.getSubNode( entrynode, AttributesUtil.XML_TAG );\nif ( attrs != null ) {\n  // ensure it parses by round-tripping through loadAttributes\n  try { AttributesUtil.loadAttributes( attrs ); }\n  catch ( Exception e ) { throw new KettleXMLException( \"Corrupt <attributes> section\", e ); }\n}","typeGuard":"boolean hasValidAttributes( Node entrynode ) {\n  Node n = XMLHandler.getSubNode( entrynode, AttributesUtil.XML_TAG );\n  if ( n == null ) return true; // optional section\n  try { AttributesUtil.loadAttributes( n ); return true; }\n  catch ( Exception e ) { return false; }\n}","tryCatchPattern":"try {\n  jobEntry.loadXML( entrynode, databases, slaveServers, rep, metaStore );\n} catch ( KettleXMLException e ) {\n  Throwable cause = e.getCause();\n  logError( \"Base info load failed: \" + ( cause != null ? cause.getMessage() : e.getMessage() ), e );\n  // re-create the entry or strip the <attributes> node and retry\n}","preventionTips":["Inspect getCause() — the generic message hides the real failure","Avoid third-party tools writing job-entry XML without schema validation","Keep PDI versions consistent between file producers and consumers","Back up .kjb files before manual edits to <attributes>"],"tags":["xml","deserialization","pdi","job-entry"],"backgroundTag":"xml-deserialization-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"}