pentaho/pentaho-kettle · error · KettleXMLException

ERROR_0001_Unable_To_Load_From_Xml_Node

ERROR_0001_Unable_To_Load_From_Xml_Node

Error message

JobEntryFileCompare.ERROR_0001_Unable_To_Load_From_Xml_Node

What it means

Thrown by JobEntryFileCompare.loadXML when the job entry cannot be deserialized from its XML node. The library wraps the original KettleXMLException in a localized message so the job entry name and cause chain are preserved. It indicates the XML fragment for this entry is malformed or incompatible with the expected schema.

Solutions

  1. Open the .kjb in Spoon and re-create the File Compare entry so valid XML is regenerated
  2. Validate the XML node contains filename1, filename2 and add_filename_result child tags
  3. Check the cause (xe) for the exact parse error and fix the malformed XML at that offset
  4. Align the Kettle engine version with the version that produced the file

Example fix

// before (hand-edited .kjb entry)
<entry name='Compare'><filename1>a.txt</filename1></entry>
// after
<entry name='Compare'><filename1>a.txt</filename1><filename2>b.txt</filename2><add_filename_result>N</add_filename_result></entry>
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: validate entry XML before loading
if (XMLHandler.getNodeValue(XMLHandler.getSubNode(entrynode, "filename1")) == null
    || XMLHandler.getNodeValue(XMLHandler.getSubNode(entrynode, "filename2")) == null) {
    throw new IllegalArgumentException("filecompare entry missing filename1/filename2");
}

Try / catch

try {
    jobEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);
} catch (KettleXMLException e) {
    logError("Corrupt filecompare entry XML: " + e.getMessage(), e);
    // fall back to defaults or skip the entry
}

Prevention

When it happens

Trigger: Calling JobMeta/Job load routines that read a .kjb file whose <entry type='filecompare'> node lacks or corrupts the filename1/filename2/add_filename_result fields, or whose super.loadXML (base entry attributes like name) fails to parse.

Common situations: Hand-edited or truncated .kjb files; XML produced by a different Pentaho/Kettle version with changed tags; copy-paste of entry XML missing required child elements.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/filecompare/JobEntryFileCompare.java:108

    retval.append( "      " ).append( XMLHandler.addTagValue( "filename1", filename1 ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "filename2", filename2 ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "add_filename_result", addFilenameToResult ) );
    if ( parentJobMeta != null ) {
      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename1 );
      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename2 );
    }
    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 );
      filename1 = XMLHandler.getTagValue( entrynode, "filename1" );
      filename2 = XMLHandler.getTagValue( entrynode, "filename2" );
      addFilenameToResult = "Y".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, "add_filename_result" ) );
    } catch ( KettleXMLException xe ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "JobEntryFileCompare.ERROR_0001_Unable_To_Load_From_Xml_Node" ), xe );
    }
  }

  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
    List<SlaveServer> slaveServers ) throws KettleException {
    try {
      filename1 = rep.getJobEntryAttributeString( id_jobentry, "filename1" );
      filename2 = rep.getJobEntryAttributeString( id_jobentry, "filename2" );
      addFilenameToResult = rep.getJobEntryAttributeBoolean( id_jobentry, "add_filename_result" );
    } catch ( KettleException dbe ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "JobEntryFileCompare.ERROR_0002_Unable_To_Load_Job_From_Repository", id_jobentry ), dbe );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {
    try {

View on GitHub (pinned to f3058517a1)