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

  1. Open the .kjb file and inspect the <entry> node for the DTDvalidator for malformed or missing <xmlfilename>/<dtdfilename> tags
  2. Re-create the DTD Validator job entry in Spoon and re-save the job
  3. Validate the job XML is well-formed with an XML parser/editor
  4. 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

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


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)