pentaho/pentaho-kettle · error · KettleXMLException
Unable to load job entry of type 'DTDvalidator' from XML…
Error message
Unable to load job entry of type 'DTDvalidator' from XML node
What it means
JobEntryDTDValidator.loadXML() failed while parsing the job entry's XML node. The original KettleXMLException raised by the XMLHandler reads (e.g. missing/corrupt tags) is wrapped and rethrown with this generic message, indicating the DTDvalidator entry could not be deserialized from the .kjb file.
Solutions
- Open the .kjb file and inspect the <entry> node for the DTDvalidator for malformed or missing <xmlfilename>/<dtdfilename> tags
- Re-create the DTD Validator job entry in Spoon and re-save the job
- Validate the job XML is well-formed with an XML parser/editor
- Check for PDI version mismatch between the file and the running engine
Defensive patterns
Strategy: try-catch
Validate before calling
// validate job XML before loading DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); f.newDocumentBuilder().parse( new File( "job.kjb" ) ); // throws if not well-formed
Try / catch
try {
jobMeta.loadXml( jobFile );
} catch ( KettleXMLException e ) {
if ( e.getMessage().contains( "DTDvalidator" ) ) {
// open job.kjb, locate the DTDvalidator <entry> node, fix or re-create it
} else { throw e; }
} Prevention
- Never hand-edit .kjb files; edit job entries through Spoon
- Keep PDI client and engine versions aligned
- Back up job files before bulk edits or migrations
- Validate job XML well-formedness after any scripted transformation of the file
When it happens
Trigger: loadXML() calls super.loadXML/XMLHandler.getTagValue on the entrynode and a KettleXMLException is thrown — malformed XML in the job file, missing expected tags, or invalid node structure.
Common situations: Job .kjb file hand-edited or truncated; file produced by a newer PDI version with changed tags; copy-paste between job files corrupted the entry node; encoding issues in the XML.
Related errors
- JobEntryAbort.UnableToLoadFromXml.Label
- JobEntryAddResultFilenames.UnableToLoadFromXml
- JobEntryCheckFilesLocked.UnableToLoadFromXml
- JobEntryColumnsExist.Meta.UnableLoadXml
- JobEntryConnectedToRepository.Meta.UnableToLoadFromXML
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/ff660f58699cb615.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/xml/core/src/main/java/org/pentaho/di/job/entries/dtdvalidator/JobEntryDTDValidator.java:101
retval.append( super.getXML() );
retval.append( " " ).append( XMLHandler.addTagValue( "xmlfilename", xmlfilename ) );
retval.append( " " ).append( XMLHandler.addTagValue( "dtdfilename", dtdfilename ) );
retval.append( " " ).append( XMLHandler.addTagValue( "dtdintern", dtdintern ) );
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 );
xmlfilename = XMLHandler.getTagValue( entrynode, "xmlfilename" );
dtdfilename = XMLHandler.getTagValue( entrynode, "dtdfilename" );
dtdintern = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "dtdintern" ) );
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( "Unable to load job entry of type 'DTDvalidator' from XML node", xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
xmlfilename = rep.getJobEntryAttributeString( id_jobentry, "xmlfilename" );
dtdfilename = rep.getJobEntryAttributeString( id_jobentry, "dtdfilename" );
dtdintern = rep.getJobEntryAttributeBoolean( id_jobentry, "dtdintern" );
} catch ( KettleException dbe ) {
throw new KettleException( "Unable to load job entry of type 'DTDvalidator' from the repository for id_jobentry="
+ id_jobentry, dbe );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
try {View on GitHub (pinned to f3058517a1)