pentaho/pentaho-kettle · error · KettleXMLException

JobExportRepository.Meta.UnableLoadXML

JobExportRepository.Meta.UnableLoadXML

Error message

JobExportRepository.Meta.UnableLoadXML

What it means

JobEntryExportRepository.loadXML wraps KettleXMLException raised while parsing the job entry's XML node with the localized message 'JobExportRepository.Meta.UnableLoadXML'. It means the job (.kjb) XML for this Export Repository entry could not be parsed.

Solutions

  1. Validate the <entry> XML block for this job entry in the .kjb file
  2. Recreate the job entry in Spoon to regenerate valid XML
  3. Compare against a working job file from the same PDI version
Defensive patterns

Strategy: try-catch

Validate before calling

// validate XML before loading job
DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( new File( kjbPath ) );

Try / catch

try { jobMeta.loadXml( file ); } catch ( KettleXMLException e ) { log.error( "Job entry XML corrupt: " + e.getCause(), e ); }

Prevention

When it happens

Trigger: Loading a .kjb whose export-repository job entry node has malformed or missing tags (e.g. 'success_condition', 'nr_errors_less_than'), typically from version skew or manual edits.

Common situations: Hand-editing job files; opening jobs exported from a different PDI version; truncated/corrupt XML files.

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/ea5da1c142d310e3. Report an issue: GitHub.

Appendix: source

Thrown at plugins/export-repository/impl/src/main/java/org/pentaho/di/job/entries/exportrepository/JobEntryExportRepository.java:196

      repositoryname = XMLHandler.getTagValue( entrynode, "repositoryname" );
      username = XMLHandler.getTagValue( entrynode, "username" );
      password = Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( entrynode, "password" ) );
      targetfilename = XMLHandler.getTagValue( entrynode, "targetfilename" );
      iffileexists = XMLHandler.getTagValue( entrynode, "iffileexists" );
      export_type = XMLHandler.getTagValue( entrynode, "export_type" );
      directoryPath = XMLHandler.getTagValue( entrynode, "directoryPath" );
      add_date = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_date" ) );
      add_time = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_time" ) );
      SpecifyFormat = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "SpecifyFormat" ) );
      date_time_format = XMLHandler.getTagValue( entrynode, "date_time_format" );
      createfolder = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "createfolder" ) );
      newfolder = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "newfolder" ) );
      add_result_filesname = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_result_filesname" ) );
      nr_errors_less_than = XMLHandler.getTagValue( entrynode, "nr_errors_less_than" );
      success_condition = XMLHandler.getTagValue( entrynode, "success_condition" );

    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString( PKG, "JobExportRepository.Meta.UnableLoadXML" ), xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      repositoryname = rep.getJobEntryAttributeString( id_jobentry, "repositoryname" );
      username = rep.getJobEntryAttributeString( id_jobentry, "username" );
      password =
        Encr.decryptPasswordOptionallyEncrypted( rep.getJobEntryAttributeString( id_jobentry, "password" ) );
      targetfilename = rep.getJobEntryAttributeString( id_jobentry, "targetfilename" );
      iffileexists = rep.getJobEntryAttributeString( id_jobentry, "iffileexists" );
      export_type = rep.getJobEntryAttributeString( id_jobentry, "export_type" );
      directoryPath = rep.getJobEntryAttributeString( id_jobentry, "directoryPath" );
      add_date = rep.getJobEntryAttributeBoolean( id_jobentry, "add_date" );
      add_time = rep.getJobEntryAttributeBoolean( id_jobentry, "add_time" );
      SpecifyFormat = rep.getJobEntryAttributeBoolean( id_jobentry, "SpecifyFormat" );
      date_time_format = rep.getJobEntryAttributeString( id_jobentry, "date_time_format" );

View on GitHub (pinned to f3058517a1)