pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry from XML node

Error message

Unable to load job entry from XML node

What it means

HL7MLLPInput.loadXML() deserializes the job entry from XML, reading server, port, message_variable, type_variable and version_variable tags via XMLHandler. A KettleXMLException during parsing is caught and rethrown as 'Unable to load job entry from XML node' with the original cause attached.

Solutions

  1. Inspect the chained cause for the precise XML parse error
  2. Repair the <entry type="HL7MLLPInput"> XML block in the .kjb
  3. Rebuild the job entry in Spoon and re-save
  4. Re-transfer the file if it was corrupted in transit

Example fix

// before (truncated entry)
<message_variable>msg
// after
<message_variable>msg</message_variable>
<type_variable>type</type_variable>
Defensive patterns

Strategy: try-catch

Try / catch

try { jobMeta.loadXML(file, null, false); } catch (KettleXMLException e) { log.error("HL7MLLPInput entry XML invalid: " + e.getMessage(), e.getCause()); }

Prevention

When it happens

Trigger: Loading a .kjb whose HL7 MLLP Input <entry> XML block is malformed or invalid so XMLHandler.getTagValue throws during loadXML.

Common situations: Hand-edited job files; truncated/corrupted downloads; schema changes across PDI versions; XML produced by external generators with invalid characters or missing parent node.

Related errors


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

Appendix: source

Thrown at plugins/hl7/core/src/main/java/org/pentaho/di/job/entries/hl7mllpin/HL7MLLPInput.java:110

    retval.append( "      " ).append( XMLHandler.addTagValue( "message_variable", messageVariableName ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "type_variable", messageTypeVariableName ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "version_variable", versionVariableName ) );

    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 );

      server = XMLHandler.getTagValue( entrynode, "server" );
      port = XMLHandler.getTagValue( entrynode, "port" );
      messageVariableName = XMLHandler.getTagValue( entrynode, "message_variable" );
      messageTypeVariableName = XMLHandler.getTagValue( entrynode, "type_variable" );
      versionVariableName = XMLHandler.getTagValue( entrynode, "version_variable" );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry from XML node", xe );
    }
  }

  @Override
  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId idJobentry, List<DatabaseMeta> databases,
      List<SlaveServer> slaveServers ) throws KettleException {
    try {
      server = rep.getJobEntryAttributeString( idJobentry, "server" );
      port = rep.getJobEntryAttributeString( idJobentry, "port" );
      messageVariableName = rep.getJobEntryAttributeString( idJobentry, "message_variable" );
      messageTypeVariableName = rep.getJobEntryAttributeString( idJobentry, "type_variable" );
      versionVariableName = rep.getJobEntryAttributeString( idJobentry, "version_variable" );
    } catch ( KettleException dbe ) {
      throw new KettleException( "Unable to load job entry from the repository for id_jobentry=" + idJobentry, dbe );
    }
  }

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

View on GitHub (pinned to f3058517a1)