pentaho/pentaho-kettle · error · KettleXMLException

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

Error message

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

What it means

JobEntryPing.loadXML wraps any KettleXMLException thrown while parsing the 'ping' job entry's XML node (hostname, timeout, nbrpaquets, pingtype, etc.) into a KettleXMLException with the fixed message 'Unable to load job entry of type ping from XML node'. The parse error is the cause. It means the ping entry's XML could not be deserialized.

Solutions

  1. Validate the .kjb XML and repair the malformed ping entry node
  2. Restore the job file from backup/version control
  3. Recreate the Ping job entry in Spoon and re-save the job

Example fix

// before
JobMeta job = new JobMeta(inputStream, null, null); // fails on malformed ping node
// after
try {
  job = new JobMeta(inputStream, null, null);
} catch (KettleXMLException e) {
  logError("Bad XML in ping job entry: " + e.getCause(), e);
  // open backup copy or fix the .kjb file
}
Defensive patterns

Strategy: try-catch

Validate before calling

Document doc = XMLHandler.loadXMLFile(kjbFile);
if (doc == null) throw new KettleException("Invalid job XML: " + kjbFile);

Try / catch

try {
  jobMeta = new JobMeta(inputStream, null, null);
} catch (KettleXMLException e) {
  logError("Ping entry XML invalid: " + e.getCause(), e);
  // restore backup or fix the ping entry node
}

Prevention

When it happens

Trigger: Loading a .kjb job file whose <entry type='PING'> node causes XMLHandler.getTagValue/attribute parsing to throw KettleXMLException — malformed XML or an invalid nested element in the ping entry block.

Common situations: Hand-edited .kjb with broken tags inside the ping entry; truncated download of the job file; XML from an incompatible Pentaho version.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/ping/JobEntryPing.java:141

        nbrPackets = nbrPaquets;
      }
      timeout = XMLHandler.getTagValue( entrynode, "timeout" );
      pingtype = XMLHandler.getTagValue( entrynode, "pingtype" );
      if ( Utils.isEmpty( pingtype ) ) {
        pingtype = classicPing;
        ipingtype = iclassicPing;
      } else {
        if ( pingtype.equals( systemPing ) ) {
          ipingtype = isystemPing;
        } else if ( pingtype.equals( bothPings ) ) {
          ipingtype = ibothPings;
        } else {
          ipingtype = iclassicPing;
        }

      }
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( "Unable to load job entry of type 'ping' 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" );
      nbrPackets = rep.getJobEntryAttributeString( id_jobentry, "nbr_packets" );

      // TODO: The following lines may be removed 3 versions after 2.5.0
      String nbrPaquets = rep.getJobEntryAttributeString( id_jobentry, "nbrpaquets" );
      if ( nbrPackets == null && nbrPaquets != null ) {
        // if only nbrpaquets exists this means that the file was
        // save by a version 2.5.0 ping job entry
        nbrPackets = nbrPaquets;
      }
      timeout = rep.getJobEntryAttributeString( id_jobentry, "timeout" );

View on GitHub (pinned to f3058517a1)