pentaho/pentaho-kettle · error · KettleXMLException

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

Error message

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

What it means

Thrown by JobEntryTelnet.loadXML when parsing a job entry XML node for a Telnet job entry fails with a KettleXMLException. It indicates the XML representation of the entry could not be read into the object. The original parse exception is preserved as the cause.

Solutions

  1. Open the .kjb in a text editor and validate the Telnet job entry XML node for malformed tags
  2. Re-save the job from a compatible Pentaho/Spoon version matching the runtime
  3. Restore the job file from backup or re-create the Telnet job entry in the designer
  4. Check the wrapped KettleXMLException cause for the exact parse error location
Defensive patterns

Strategy: try-catch

Validate before calling

Document doc = XMLHandler.loadXMLFile( jobFile ); if ( doc == null || XMLHandler.getSubNode( doc.getFirstChild(), "entries" ) == null ) { throw new IllegalStateException( "Malformed job XML" ); }

Try / catch

try { entry.loadXML( entrynode, databases, slaveServers, rep, metaStore ); } catch ( KettleXMLException e ) { log.error( "Bad Telnet entry XML", e.getCause() ); }

Prevention

When it happens

Trigger: Loading a .kjb job file whose Telnet job entry XML node is malformed, uses an unrecognized schema/version, or contains unreadable content that XMLHandler cannot parse for hostname/port/timeout.

Common situations: Hand-edited or truncated .kjb files; jobs exported by a newer Pentaho version then opened in an older one; XML node tags renamed across versions causing null/invalid values downstream; file encoding corruption.

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/f196cc696046ad0e. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/telnet/JobEntryTelnet.java:99

    StringBuilder retval = new StringBuilder( 100 );

    retval.append( super.getXML() );
    retval.append( "      " ).append( XMLHandler.addTagValue( "hostname", hostname ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "port", port ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "timeout", timeout ) );

    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 );
      hostname = XMLHandler.getTagValue( entrynode, "hostname" );
      port = XMLHandler.getTagValue( entrynode, "port" );
      timeout = XMLHandler.getTagValue( entrynode, "timeout" );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'Telnet' from XML node", xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      hostname = rep.getJobEntryAttributeString( id_jobentry, "hostname" );
      port = rep.getJobEntryAttributeString( id_jobentry, "port" );
      timeout = rep.getJobEntryAttributeString( id_jobentry, "timeout" );
    } catch ( KettleException dbe ) {
      throw new KettleException(
        "Unable to load job entry of type 'Telnet' exists 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)