pentaho/pentaho-kettle · error · KettleXMLException

JobEntryAddResultFilenames.UnableToLoadFromXml

Error message

JobEntryAddResultFilenames.UnableToLoadFromXml

What it means

JobEntryAddResultFilenames.loadXML throws KettleXMLException wrapping this message when parsing the job entry's XML <fields> section fails. The library throws it to preserve the cause while reporting that this specific job entry could not be deserialized from a .kjb file.

Solutions

  1. Open the .kjb file in Spoon and fix or delete the AddResultFilenames entry that fails to load.
  2. Validate the XML is well-formed (xmllint) and that each <field> node has <name> and <filemask> children.
  3. Recreate the job entry in the designer so it serializes fresh XML.

Example fix

// before
Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i ); // fields may be null
// after
Node fields = XMLHandler.getSubNode( entrynode, "fields" );
int nrFields = fields != null ? XMLHandler.countNodes( fields, "field" ) : 0;
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-validate XML before loadXML
Document doc = XMLHandler.loadXMLFile( new File( kjbPath ) );
Node fields = XMLHandler.getSubNode( XMLHandler.getSubNode( doc, "entry" ), "fields" );
if ( fields == null || XMLHandler.countNodes( fields, "field" ) == 0 ) { throw new IllegalStateException( "no <field> nodes" ); }

Type guard

boolean isValidFieldsNode(Node n) { return n != null && XMLHandler.countNodes( n, "field" ) > 0; }

Try / catch

try { entry.loadXML( entrynode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( "AddResultFilenames XML invalid: " + e.getMessage(), e ); /* fall back to defaults or re-create entry */ }

Prevention

When it happens

Trigger: Calling loadXML with a malformed or unexpected XML node: a missing/corrupt <field> subnode, or XMLHandler.getTagValue returning data that breaks parsing (e.g. truncated file, wrong element nesting).

Common situations: Hand-edited or partially written .kjb files, files generated by newer Pentaho versions loaded in an older one, or corrupted XML during version control merges.

Related errors


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

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/job/entries/addresultfilenames/JobEntryAddResultFilenames.java:147

      includeSubfolders = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "include_subfolders" ) );
      deleteallbefore = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "delete_all_before" ) );

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

      // How many field arguments?
      int nrFields = XMLHandler.countNodes( fields, "field" );
      arguments = new String[nrFields];
      filemasks = new String[nrFields];

      // Read them all...
      for ( int i = 0; i < nrFields; 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, "JobEntryAddResultFilenames.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" );

      deleteallbefore = rep.getJobEntryAttributeBoolean( id_jobentry, "delete_all_before" );

      // How many arguments?
      int argnr = rep.countNrJobEntryAttributes( id_jobentry, "name" );
      arguments = new String[argnr];
      filemasks = new String[argnr];

      // Read them all...

View on GitHub (pinned to f3058517a1)