pentaho/pentaho-kettle · error · KettleXMLException
ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
Error message
JobEntryWebServiceAvailable.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
What it means
KettleXMLException (code ERROR_0001) thrown by JobEntryWebServiceAvailable.loadXML when parsing the job entry's XML node fails with a KettleXMLException. It indicates the 'web service available' entry could not be loaded from the .kjb XML. The original parse error is preserved as the cause.
Solutions
- Validate the .kjb XML is well-formed (xmllint or an XML editor)
- Restore the job file from version control or backup
- Recreate the 'Check webservice availability' job entry in Spoon
- Check the cause chain for the exact parse offset/character error
Example fix
// before
entry.loadXML(entrynode, databases, slaveServers); // throws
// after
try {
entry.loadXML(entrynode, databases, slaveServers);
} catch (KettleXMLException e) {
logError("Bad XML for web-service-available entry: " + e.getCause(), e);
} Defensive patterns
Strategy: try-catch
Validate before calling
// before loadXML
Document doc = XMLHandler.loadXMLFile(inputStream);
if (doc == null || XMLHandler.getSubNode(doc, "entry") == null) {
throw new IllegalArgumentException("not a valid job entry XML node");
} Try / catch
try {
entry.loadXML(entrynode, databases, slaveServers);
} catch (KettleXMLException e) {
logError("XML load failed: " + e.getCause(), e);
// restore from backup or recreate entry
} Prevention
- Never hand-edit kjb XML without validating afterwards
- Validate XML with a linter/xmllint in CI for generated jobs
- Store job files in version control
- Watch encoding (UTF-8) when transferring job files between systems
When it happens
Trigger: Calling loadXML with a malformed or unexpected XML node — missing required tags, invalid XML characters, or a corrupted .kjb file — where XMLHandler.getTagValue or super.loadXML throws KettleXMLException.
Common situations: Hand-edited kjb files; XML truncated by a failed transfer/checkout; wrong file passed to loadXML; encoding issues after editing XML in a non-UTF-8 editor.
Understand the failure class
Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.
Related errors
- Unable to load job entry of type 'create file' from XML node
- ERROR_0001
- ExecSQLRowMeta.Exception.UnableToLoadStepInfoFromXML
- GPBulkLoaderMeta.Exception.UnableToReadStepInfoFromXML
- JobDosToUnix.Error.Exception.UnableLoadXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1de5ebbec4e67dfb.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/job/entries/webserviceavailable/JobEntryWebServiceAvailable.java:88
public String getXML() {
StringBuilder retval = new StringBuilder( 50 );
retval.append( super.getXML() );
retval.append( " " ).append( XMLHandler.addTagValue( "url", url ) );
retval.append( " " ).append( XMLHandler.addTagValue( "connectTimeOut", connectTimeOut ) );
retval.append( " " ).append( XMLHandler.addTagValue( "readTimeOut", readTimeOut ) );
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 );
url = XMLHandler.getTagValue( entrynode, "url" );
connectTimeOut = XMLHandler.getTagValue( entrynode, "connectTimeOut" );
readTimeOut = XMLHandler.getTagValue( entrynode, "readTimeOut" );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "JobEntryWebServiceAvailable.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node" ), xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
url = rep.getJobEntryAttributeString( id_jobentry, "url" );
connectTimeOut = rep.getJobEntryAttributeString( id_jobentry, "connectTimeOut" );
readTimeOut = rep.getJobEntryAttributeString( id_jobentry, "readTimeOut" );
} catch ( KettleException dbe ) {
throw new KettleException( BaseMessages.getString(
PKG, "JobEntryWebServiceAvailable.ERROR_0002_Cannot_Load_Job_From_Repository", "" + id_jobentry ), dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {View on GitHub (pinned to f3058517a1)