pentaho/pentaho-kettle · error · KettleXMLException

Error_0001

Error_0001

Error message

JobEntryDeleteFile.Error_0001_Unable_To_Load_Job_From_Xml_Node

What it means

JobEntryDeleteFile.loadXML throws this KettleXMLException (code Error_0001) when reading the delete-file entry's XML node fails — super.loadXML, the 'filename' tag, or the 'fail_if_file_not_exists' tag. It indicates the entry could not be deserialized from the .kjb document.

Solutions

  1. Validate the .kjb XML parses and the <entry> block contains <filename> and <fail_if_file_not_exists> tags
  2. Recreate the Delete file entry in Spoon and re-save
  3. Use xmllint or similar to find the malformed section
  4. Check the chained cause (xe) to see whether failure came from super.loadXML or a missing tag

Example fix

// before
<entry>
  <name>Delete file</name>
</entry>
// after
<entry>
  <name>Delete file</name>
  <filename>/tmp/old.log</filename>
  <fail_if_file_not_exists>N</fail_if_file_not_exists>
</entry>
Defensive patterns

Strategy: validation

Validate before calling

// before loadXML
Node entrynode = XMLHandler.getSubNode(jobnode, "entry");
if (entrynode == null) throw new KettleXMLException("Missing <entry> node");
if (XMLHandler.getTagValue(entrynode, "filename") == null) {
  throw new KettleXMLException("Missing <filename> in Delete file entry");
}

Try / catch

try {
  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  log.error("DeleteFile entry XML invalid (code Error_0001)", e.getCause());
  // repair the <entry> node in the .kjb or recreate in Spoon
  throw e;
}

Prevention

When it happens

Trigger: loadXML with a malformed or missing entrynode, an XMLHandler error while fetching tags, or a KettleXMLException from super.loadXML.

Common situations: Truncated or hand-edited .kjb file; XML generated by a different Pentaho version missing expected tags; copy-paste of an incomplete <entry> block; file encoding corruption.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/deletefile/JobEntryDeleteFile.java:100

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "filename", filename ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "fail_if_file_not_exists", failIfFileNotExists ) );
    if ( parentJobMeta != null ) {
      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename );
    }

    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 );
      filename = XMLHandler.getTagValue( entrynode, "filename" );
      failIfFileNotExists = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "fail_if_file_not_exists" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryDeleteFile.Error_0001_Unable_To_Load_Job_From_Xml_Node" ), xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      filename = rep.getJobEntryAttributeString( id_jobentry, "filename" );
      failIfFileNotExists = rep.getJobEntryAttributeBoolean( id_jobentry, "fail_if_file_not_exists" );
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryDeleteFile.ERROR_0002_Unable_To_Load_From_Repository", id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "filename", filename );

View on GitHub (pinned to f3058517a1)