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

JobEntryDummy wraps the 'File Exists' job entry and loads its settings (source directory, target directory, wildcard) from a job's XML definition via loadXML. If XMLHandler parsing or the super.loadXML call fails, it rethrows as a KettleXMLException with this message. It indicates the job entry's XML node could not be parsed into the entry's settings.

Solutions

  1. Open the .kjb file and validate the XML; fix malformed tags around the 'file exists' entry
  2. Recreate the File Exists job entry in Spoon and re-save the job
  3. Check that the file was created by a compatible Kettle/PDI version and re-export if not
  4. Inspect the cause (xe) in the stack trace to find the exact parsing failure

Example fix

// before
// parsing a hand-edited node: <source_directory>x</sourcedir>
// after
// use the exact tag names the entry saves: <sourceDirectory>...</sourceDirectory>
Defensive patterns

Strategy: validation

Validate before calling

// validate the job XML before load
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
Document doc = f.newDocumentBuilder().parse(jobXmlFile);
NodeList entries = doc.getElementsByTagName("entry");
if (entries.getLength() == 0) throw new IllegalArgumentException("No job entry nodes in XML");

Try / catch

try { jobEntry.loadXML(node, databases, slaveServers); } catch (KettleXMLException e) { logger.error("Failed to parse job entry XML", e); throw e; }

Prevention

When it happens

Trigger: Calling loadXML on a job entry node whose XML is malformed or missing expected structure, causing super.loadXML or XMLHandler.getTagValue to throw a KettleXMLException.

Common situations: Hand-edited or corrupted .kjb job files; XML saved by an incompatible Pentaho/Kettle version missing required child nodes; truncated file transfer.

Understand the failure class

Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.

Related errors


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

Appendix: source

Thrown at plugins/dummy/core/src/main/java/org/pentaho/di/pdi/jobentry/dummy/JobEntryDummy.java:109

    retval.append( super.getXML() );

    retval.append( "      " + XMLHandler.addTagValue( SOURCEDIRECTORY, sourceDirectory ) );
    retval.append( "      " + XMLHandler.addTagValue( TARGETDIRECTORY, targetDirectory ) );
    retval.append( "      " + XMLHandler.addTagValue( WILDCARD, wildcard ) );

    return retval.toString();
  }

  @Override
  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers, Repository rep ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      sourceDirectory = XMLHandler.getTagValue( entrynode, SOURCEDIRECTORY );
      targetDirectory = XMLHandler.getTagValue( entrynode, TARGETDIRECTORY );
      wildcard = XMLHandler.getTagValue( entrynode, WILDCARD );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load file exists job entry from XML node",
          xe );
    }
  }

  @Override
  public void loadRep( Repository rep, ObjectId id_jobentry, List<DatabaseMeta> databases, List<SlaveServer> slaveServers ) throws KettleException {
    try {
      super.loadRep( rep, id_jobentry, databases, slaveServers );
      sourceDirectory = rep.getJobEntryAttributeString( id_jobentry, SOURCEDIRECTORY );
      targetDirectory = rep.getJobEntryAttributeString( id_jobentry, TARGETDIRECTORY );
      wildcard = rep.getJobEntryAttributeString( id_jobentry, WILDCARD );
    } catch ( KettleException dbe ) {
      throw new KettleException(
          "Unable to load job entry for type file exists from the repository for id_jobentry="
              + id_jobentry, dbe );
    }
  }

View on GitHub (pinned to f3058517a1)