pentaho/pentaho-kettle · error · KettleXMLException

Unable to load job entry of type 'xsdvalidator' from XML…

Error message

Unable to load job entry of type 'xsdvalidator' from XML node

What it means

JobEntryXSDValidator.loadXML rethrows KettleXMLException when the job entry cannot be deserialized from its XML <entry> node. It wraps failures in XMLHandler tag reads or super.loadXML, keeping the original cause.

Solutions

  1. Inspect the wrapped cause exception for the exact XML parsing problem
  2. Re-export or re-save the job from Spoon to regenerate valid XML
  3. Check the <entry> node contains the expected xsdvalidator fields
  4. Verify the file encoding is valid UTF-8
Defensive patterns

Strategy: try-catch

Try / catch

try {
  entry.loadXML( entrynode, databases, slaveServers );
} catch ( KettleXMLException e ) {
  logError( "xsdvalidator entry load failed: " + e.getCause(), e );
  throw e;
}

Prevention

When it happens

Trigger: Loading a .kjb job whose <entry type='xsdvalidator'> node is malformed or unreadable via XMLHandler.getTagValue / super.loadXML.

Common situations: Hand-edited or corrupted .kjb files; job XML written by a newer PDI version containing unexpected structure; encoding issues in the job file.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/d7a803cecc376aa9. Report an issue: GitHub.

Appendix: source

Thrown at plugins/xml/core/src/main/java/org/pentaho/di/job/entries/xsdvalidator/JobEntryXSDValidator.java:120

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "xmlfilename", xmlfilename ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "xsdfilename", xsdfilename ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "allowExternalEntities", allowExternalEntities ) );

    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" );
      xsdfilename = XMLHandler.getTagValue( entrynode, "xsdfilename" );
      allowExternalEntities = YES.equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "allowExternalEntities" ) );

    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'xsdvalidator' 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" );
      xsdfilename = rep.getJobEntryAttributeString( id_jobentry, "xsdfilename" );
      allowExternalEntities =
        Boolean.parseBoolean( rep.getJobEntryAttributeString( id_jobentry, "allowExternalEntities" ) );
    } catch ( KettleException dbe ) {
      throw new KettleException( "Unable to load job entry of type 'xsdvalidator' 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)