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
- Open the .kjb in Spoon and re-create the File Compare entry so valid XML is regenerated
- Validate the XML node contains filename1, filename2 and add_filename_result child tags
- Check the cause (xe) for the exact parse error and fix the malformed XML at that offset
- 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
- Never hand-edit .kjb files; use Spoon
- Keep the producing and consuming Kettle versions aligned
- Commit .kjb files to VCS so malformed edits are diffable/revertible
- Keep the cause chain when rethrowing (this error wraps xe)
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
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node
- JobEntryAbort.UnableToLoadFromXml.Label
- JobEntryAddResultFilenames.UnableToLoadFromXml
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)