pentaho/pentaho-kettle · error · KettleXMLException

JobEntryDeleteResultFilenames.CanNotLoadFromXML

Error message

JobEntryDeleteResultFilenames.CanNotLoadFromXML

What it means

Thrown when the XML for a 'Delete Result Filenames' job entry cannot be parsed during loadXML(). It wraps the original KettleXMLException and includes its message. Indicates the job entry's XML node is malformed or missing expected tags (foldername, specify_wildcard, wildcard, wildcardexclude).

Solutions

  1. Validate the .kjb XML for well-formedness and presence of the DeleteResultFilenames tags
  2. Regenerate the job entry from Spoon to produce valid XML
  3. Confirm you pass the correct <entry> node to loadXML()
  4. Read xe.getMessage() embedded in the thrown error to locate the parse failure

Example fix

// before
Node entrynode = XMLHandler.getSubNode(je, "entry"); // could be null / wrong type
entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
// after
Node entrynode = XMLHandler.getSubNode(je, "entry");
if (entrynode == null) throw new KettleXMLException("No <entry> node found");
try {
  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  logError("XML malformed: " + e.getMessage());
  throw e;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// validate XML before loadXML
Document doc = XMLHandler.loadXMLFile(new File(kjbPath));
if (doc == null) throw new IllegalArgumentException("Not valid XML: " + kjbPath);
Node entry = XMLHandler.getSubNode(doc.getDocumentElement(), "entry");
if (entry == null || XMLHandler.getTagValue(entry, "foldername") == null
    && XMLHandler.getSubNode(entry, "foldername") == null) {
  logBasic("Warning: DeleteResultFilenames entry has no foldername tag");
}

Type guard

boolean isValidEntryNode(Node node) {
  return node != null && "entry".equals(node.getNodeName());
}

Try / catch

try {
  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
  logError("CanNotLoadFromXML: " + e.getMessage());
  throw e;
}

Prevention

When it happens

Trigger: Calling loadXML() on a .kjb fragment where XMLHandler.getTagValue for the entry's tags throws a KettleXMLException — typically malformed XML structure or wrong node type passed in.

Common situations: Truncated or hand-edited .kjb files; schema drift between Pentaho versions; loading a node from the wrong entry type; encoding corruption in the XML file.

Understand the failure class

Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/deleteresultfilenames/JobEntryDeleteResultFilenames.java:102

    retval.append( "      " ).append( XMLHandler.addTagValue( "foldername", foldername ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "specify_wildcard", specifywildcard ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "wildcard", wildcard ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "wildcardexclude", wildcardexclude ) );

    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 );
      foldername = XMLHandler.getTagValue( entrynode, "foldername" );
      specifywildcard = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "specify_wildcard" ) );
      wildcard = XMLHandler.getTagValue( entrynode, "wildcard" );
      wildcardexclude = XMLHandler.getTagValue( entrynode, "wildcardexclude" );

    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryDeleteResultFilenames.CanNotLoadFromXML", xe.getMessage() ) );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      foldername = rep.getJobEntryAttributeString( id_jobentry, "foldername" );
      specifywildcard = rep.getJobEntryAttributeBoolean( id_jobentry, "specify_wildcard" );
      wildcard = rep.getJobEntryAttributeString( id_jobentry, "wildcard" );
      wildcardexclude = rep.getJobEntryAttributeString( id_jobentry, "wildcardexclude" );
    } catch ( KettleException dbe ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryDeleteResultFilenames.CanNotLoadFromRep", "" + id_jobentry, dbe.getMessage() ) );
    }
  }

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

View on GitHub (pinned to f3058517a1)