pentaho/pentaho-kettle · error · KettleXMLException

JobEntryDeleteFiles.UnableToLoadFromXml

Error message

JobEntryDeleteFiles.UnableToLoadFromXml

What it means

JobEntryDeleteFiles.loadXML throws this KettleXMLException when parsing the delete-files entry's XML node fails, including reading the <fields>/<field> blocks with 'name' and 'filemask' sub-tags. The original KettleXMLException is chained. It means the wildcard file-delete entry could not be deserialized from the job XML.

Solutions

  1. Open the .kjb and verify the <fields> block with <field><name>...</name><filemask>...</filemask></field> entries is intact
  2. Recreate the Delete files entry in Spoon and re-save the job
  3. Validate the full XML with a parser to locate the malformed node
  4. Check the chained cause (xe) for the exact XML path that failed

Example fix

// before
<fields>
  <field>
    <name>/tmp/logs/</name>
</fields>
// after
<fields>
  <field>
    <name>/tmp/logs/</name>
    <filemask>.*\\.log</filemask>
  </field>
</fields>
Defensive patterns

Strategy: validation

Validate before calling

// before loadXML
Node fields = XMLHandler.getSubNode(entrynode, "fields");
if (fields == null) throw new KettleXMLException("Missing <fields> in Delete files entry");
int n = XMLHandler.countNodes(fields, "field");
if (n == 0) throw new KettleXMLException("No <field> entries in Delete files entry");

Try / catch

try {
  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  log.error("DeleteFiles entry XML invalid", e.getCause());
  // fix <fields>/<field><name>/<filemask> structure or recreate in Spoon
  throw e;
}

Prevention

When it happens

Trigger: loadXML with a malformed entrynode, missing/broken <fields> structure, or XMLHandler throwing while fetching the field sub-nodes.

Common situations: Hand-edited .kjb where the fields block was truncated; job XML from another version with a different structure; copy-paste corruption; file truncation during transfer.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/deletefiles/JobEntryDeleteFiles.java:154

    Repository rep, IMetaStore metaStore ) throws KettleXMLException {
    try {
      super.loadXML( entrynode, databases, slaveServers );
      argFromPrevious = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "arg_from_previous" ) );
      includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );

      Node fields = XMLHandler.getSubNode( entrynode, "fields" );

      int numberOfFields = XMLHandler.countNodes( fields, "field" );
      allocate( numberOfFields );

      for ( int i = 0; i < numberOfFields; i++ ) {
        Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i );

        arguments[i] = XMLHandler.getTagValue( fnode, "name" );
        filemasks[i] = XMLHandler.getTagValue( fnode, "filemask" );
      }
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString( PKG, "JobEntryDeleteFiles.UnableToLoadFromXml" ), xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      argFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, "arg_from_previous" );
      includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );

      int numberOfArgs = rep.countNrJobEntryAttributes( id_jobentry, "name" );
      allocate( numberOfArgs );

      for ( int i = 0; i < numberOfArgs; i++ ) {
        arguments[i] = rep.getJobEntryAttributeString( id_jobentry, i, "name" );
        filemasks[i] = rep.getJobEntryAttributeString( id_jobentry, i, "filemask" );
      }
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString( PKG, "JobEntryDeleteFiles.UnableToLoadFromRepo", String

View on GitHub (pinned to f3058517a1)