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

HL7MLLPAcknowledge.loadXML() deserializes the job entry from its XML representation, reading server/port/variable tags via XMLHandler. Any KettleXMLException raised while parsing (malformed XML, missing or invalid node) is caught and rethrown as a new KettleXMLException with the message 'Unable to load job entry from XML node' and the original as cause.

Solutions

  1. Inspect the chained cause to find the exact XML parse error and line
  2. Validate/repair the <entry type="HL7MLLPAck"> XML block in the .kjb file
  3. Recreate the job entry in Spoon and re-save the job
  4. Check the file was not truncated/corrupted in transfer and re-export from source

Example fix

// before (malformed entry XML)
<server>host<port>5050</port>
// after
<server>host</server>
<port>5050</port>
Defensive patterns

Strategy: try-catch

Try / catch

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

Prevention

When it happens

Trigger: Loading a .kjb containing this HL7 MLLP Acknowledge entry whose <entry> XML block is malformed or unreadable — XMLHandler.getTagValue throws KettleXMLException during loadXML.

Common situations: Hand-edited or truncated job files; version incompatibility where the XML schema changed; corrupted file transfer; XML with invalid characters or wrong nesting produced by external tooling.

Related errors


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

Appendix: source

Thrown at plugins/hl7/core/src/main/java/org/pentaho/di/job/entries/hl7mllpack/HL7MLLPAcknowledge.java:101

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "server", server ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "port", port ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "variable", variableName ) );

    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" );
      variableName = XMLHandler.getTagValue( entrynode, "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" );
      variableName = rep.getJobEntryAttributeString( idJobentry, "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 {
    try {
      rep.saveJobEntryAttribute( id_job, getObjectId(), "server", server );

View on GitHub (pinned to f3058517a1)