pentaho/pentaho-kettle · error · KettleXMLException

JobEntrySimple.Error.Exception.UnableLoadXML

JobEntrySimple.Error.Exception.UnableLoadXML

Error message

JobEntrySimple.Error.Exception.UnableLoadXML

What it means

JobEntrySimpleEval.loadXML parses the 'simple eval' job entry's XML tags (success conditions, variable settings). Any KettleXMLException during parsing is rethrown as KettleXMLException with the localized message keyed by JobEntrySimple.Error.Exception.UnableLoadXML ('Unable to load job entry of type ... from XML node'-style text from the messages bundle).

Solutions

  1. Validate the .kjb XML is well-formed and the simple_eval node contains the expected tags
  2. Recreate the 'Simple Evaluation' job entry in Spoon and re-save
  3. Restore the job file from backup/version control
  4. Check the nested KettleXMLException cause for the exact parse error and line
Defensive patterns

Strategy: try-catch

Try / catch

try {
  jobEntrySimpleEval.loadXML(entrynode, databases, metaStore);
} catch (KettleXMLException e) {
  logError("Simple Eval job entry XML invalid: " + e.getCause().getMessage(), e);
  // recreate the entry or restore a backup .kjb
}

Prevention

When it happens

Trigger: XMLHandler.getTagValue for tags like 'successnumbercondition', 'successbooleancondition', 'successwhenvarset' throws inside loadXML — malformed .kjb XML, null entrynode, or invalid nested content.

Common situations: Truncated or hand-edited .kjb files; jobs moved between Pentaho versions where tag names changed; XML escaping errors from special characters in condition values; copy-pasted node missing expected child tags.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/simpleeval/JobEntrySimpleEval.java:362

      valuetype = getValueTypeByCode( Const.NVL( XMLHandler.getTagValue( entrynode, "valuetype" ), "" ) );
      fieldname = XMLHandler.getTagValue( entrynode, "fieldname" );
      fieldtype = getFieldTypeByCode( Const.NVL( XMLHandler.getTagValue( entrynode, "fieldtype" ), "" ) );
      variablename = XMLHandler.getTagValue( entrynode, "variablename" );
      mask = XMLHandler.getTagValue( entrynode, "mask" );
      comparevalue = XMLHandler.getTagValue( entrynode, "comparevalue" );
      minvalue = XMLHandler.getTagValue( entrynode, "minvalue" );
      maxvalue = XMLHandler.getTagValue( entrynode, "maxvalue" );
      successcondition =
        getSuccessConditionByCode( Const.NVL( XMLHandler.getTagValue( entrynode, "successcondition" ), "" ) );
      successnumbercondition =
        getSuccessNumberConditionByCode( Const.NVL(
          XMLHandler.getTagValue( entrynode, "successnumbercondition" ), "" ) );
      successbooleancondition =
        getSuccessBooleanConditionByCode( Const.NVL( XMLHandler.getTagValue(
          entrynode, "successbooleancondition" ), "" ) );
      successwhenvarset = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "successwhenvarset" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException(
        BaseMessages.getString( PKG, "JobEntrySimple.Error.Exception.UnableLoadXML" ), xe );
    }
  }

  @Override
  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      valuetype = getValueTypeByCode( Const.NVL( rep.getJobEntryAttributeString( id_jobentry, "valuetype" ), "" ) );
      fieldname = rep.getJobEntryAttributeString( id_jobentry, "fieldname" );
      variablename = rep.getJobEntryAttributeString( id_jobentry, "variablename" );
      fieldtype = getFieldTypeByCode( Const.NVL( rep.getJobEntryAttributeString( id_jobentry, "fieldtype" ), "" ) );
      mask = rep.getJobEntryAttributeString( id_jobentry, "mask" );
      comparevalue = rep.getJobEntryAttributeString( id_jobentry, "comparevalue" );
      minvalue = rep.getJobEntryAttributeString( id_jobentry, "minvalue" );
      maxvalue = rep.getJobEntryAttributeString( id_jobentry, "maxvalue" );
      successcondition =
        getSuccessConditionByCode( Const.NVL(

View on GitHub (pinned to f3058517a1)