{"record":{"id":"ff660f58699cb615","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-dtdvalidator-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'DTDvalidator' from XML node","messagePattern":"Unable to load job entry of type 'DTDvalidator' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/xml/core/src/main/java/org/pentaho/di/job/entries/dtdvalidator/JobEntryDTDValidator.java","lineNumber":101,"sourceCode":"    retval.append( super.getXML() );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"xmlfilename\", xmlfilename ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"dtdfilename\", dtdfilename ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"dtdintern\", dtdintern ) );\n\n    return retval.toString();\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers, Repository rep,\n      IMetaStore metaStore ) throws KettleXMLException {\n\n    try {\n      super.loadXML( entrynode, databases, slaveServers );\n      xmlfilename = XMLHandler.getTagValue( entrynode, \"xmlfilename\" );\n      dtdfilename = XMLHandler.getTagValue( entrynode, \"dtdfilename\" );\n      dtdintern = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"dtdintern\" ) );\n\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'DTDvalidator' from XML node\", xe );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n      List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      xmlfilename = rep.getJobEntryAttributeString( id_jobentry, \"xmlfilename\" );\n      dtdfilename = rep.getJobEntryAttributeString( id_jobentry, \"dtdfilename\" );\n      dtdintern = rep.getJobEntryAttributeBoolean( id_jobentry, \"dtdintern\" );\n\n    } catch ( KettleException dbe ) {\n      throw new KettleException( \"Unable to load job entry of type 'DTDvalidator' from the repository for id_jobentry=\"\n          + id_jobentry, dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {\n    try {","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/xml/core/src/main/java/org/pentaho/di/job/entries/dtdvalidator/JobEntryDTDValidator.java#L83-L119","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// validate job XML before loading\nDocumentBuilderFactory f = DocumentBuilderFactory.newInstance();\nf.newDocumentBuilder().parse( new File( \"job.kjb\" ) ); // throws if not well-formed","typeGuard":null,"tryCatchPattern":"try {\n  jobMeta.loadXml( jobFile );\n} catch ( KettleXMLException e ) {\n  if ( e.getMessage().contains( \"DTDvalidator\" ) ) {\n    // open job.kjb, locate the DTDvalidator <entry> node, fix or re-create it\n  } else { throw e; }\n}","preventionTips":["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"],"tags":["kettle","xml","job-entry","deserialization","dtd"],"backgroundTag":"xml-parse-error","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}