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
- Inspect the chained cause for the precise XML parse error
- Repair the <entry type="HL7MLLPInput"> XML block in the .kjb
- Rebuild the job entry in Spoon and re-save
- 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
- Validate .kjb files with xmllint after any external edit
- Avoid transferring job files in non-binary mode
- Test job files after PDI upgrades
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
- Unable to load job entry from XML node
- JobEntryZipFile.UnableLoadJobEntryXML
- Unable to load base info for job entry
- Unable to load file exists job entry from XML node
- Unable to load job entry of type 'Msgbox Info' from XML node
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)