pentaho/pentaho-kettle · error · KettleXMLException

Unable to load file exists job entry from XML node

Error message

Unable to load file exists job entry from XML node

What it means

Thrown by PaloCubeDelete.loadXML() when parsing the job entry's XML node raises a KettleXMLException, wrapped with the message 'Unable to load file exists job entry from XML node'. The wording is a copy-paste error inherited from another entry type; this is the Palo Delete cube entry.

Solutions

  1. Inspect the PaloCubeDelete entry XML in the .kjb file for missing 'connection' or 'cubeName' tags
  2. Re-create the job entry in Spoon, reconfigure, and save
  3. Restore the job file from a backup or version control
  4. Load the job with the PDI version that originally produced the XML

Example fix

// before (corrupt node)
// <connection/> missing entirely
// after: restore node
// <connection>oracleLocal</connection><cubeName>SALES</cubeName>
Defensive patterns

Strategy: try-catch

Validate before calling

org.w3c.dom.Node entry = XMLHandler.getSubNode( jobnode, "entry" );
if ( entry == null || XMLHandler.getTagValue( entry, "connection" ) == null ) {
  throw new IllegalStateException( "PaloCubeDelete entry XML missing connection" );
}

Try / catch

try { entry.loadXML( node, databases, slaveServers ); } catch ( KettleXMLException e ) { log.error( "Corrupt XML for PaloCubeDelete: " + e.getMessage(), e ); throw e; }

Prevention

When it happens

Trigger: loadXML given a node whose <connection>, <cubeName>, or other expected tags are missing/malformed so super.loadXML or XMLHandler.getTagValue handling throws.

Common situations: Corrupted or hand-edited .kjb files; XML from a different/newer PDI version; truncated file transfer; merge conflicts in job XML.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/d60d76708f9388a2. Report an issue: GitHub.

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/job/entries/palo/JobEntryCubeDelete/PaloCubeDelete.java:92

    retval.append( super.getXML() );

    retval.append( "      " ).append(
        XMLHandler.addTagValue( "connection", getDatabaseMeta() == null ? "" : getDatabaseMeta().getName() ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "cubeName", getCubeName() ) );

    return retval.toString();
  }

  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers, Repository rep,
      IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );

      this.setDatabaseMeta( DatabaseMeta.findDatabase( databases, XMLHandler.getTagValue( entrynode, "connection" ) ) );
      this.setCubeName( XMLHandler.getTagValue( entrynode, "cubeName" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load file exists job entry from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
      List<SlaveServer> slaveServers ) throws KettleException {
    try {
      this.databaseMeta =
          rep.loadDatabaseMetaFromJobEntryAttribute( id_jobentry, "connection", "id_database", databases );
      this.setCubeName( rep.getStepAttributeString( id_jobentry, "cubeName" ) );

    } catch ( KettleException dbe ) {
      throw new KettleException( "Unable to load job entry for type file exists from the repository for id_jobentry="
          + id_jobentry, dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {

View on GitHub (pinned to f3058517a1)