{"record":{"id":"2b6688412982d63d","repo":"pentaho/pentaho-kettle","slug":"error-0001-unable-to-load-from-xml-node","errorCode":"ERROR_0001_Unable_To_Load_From_Xml_Node","errorMessage":"JobEntryFileCompare.ERROR_0001_Unable_To_Load_From_Xml_Node","messagePattern":"JobEntryFileCompare\\.ERROR_0001_Unable_To_Load_From_Xml_Node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/filecompare/JobEntryFileCompare.java","lineNumber":108,"sourceCode":"    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"filename1\", filename1 ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"filename2\", filename2 ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"add_filename_result\", addFilenameToResult ) );\n    if ( parentJobMeta != null ) {\n      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename1 );\n      parentJobMeta.getNamedClusterEmbedManager().registerUrl( filename2 );\n    }\n    return retval.toString();\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,\n    Repository rep, IMetaStore metaStore ) throws KettleXMLException {\n    try {\n      super.loadXML( entrynode, databases, slaveServers );\n      filename1 = XMLHandler.getTagValue( entrynode, \"filename1\" );\n      filename2 = XMLHandler.getTagValue( entrynode, \"filename2\" );\n      addFilenameToResult = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"add_filename_result\" ) );\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( BaseMessages.getString(\n        PKG, \"JobEntryFileCompare.ERROR_0001_Unable_To_Load_From_Xml_Node\" ), xe );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n    List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      filename1 = rep.getJobEntryAttributeString( id_jobentry, \"filename1\" );\n      filename2 = rep.getJobEntryAttributeString( id_jobentry, \"filename2\" );\n      addFilenameToResult = rep.getJobEntryAttributeBoolean( id_jobentry, \"add_filename_result\" );\n    } catch ( KettleException dbe ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"JobEntryFileCompare.ERROR_0002_Unable_To_Load_Job_From_Repository\", id_jobentry ), dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {\n    try {","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/filecompare/JobEntryFileCompare.java#L90-L126","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before (hand-edited .kjb entry)\n<entry name='Compare'><filename1>a.txt</filename1></entry>\n// after\n<entry name='Compare'><filename1>a.txt</filename1><filename2>b.txt</filename2><add_filename_result>N</add_filename_result></entry>","handlingStrategy":"try-catch","validationCode":"// Java: validate entry XML before loading\nif (XMLHandler.getNodeValue(XMLHandler.getSubNode(entrynode, \"filename1\")) == null\n    || XMLHandler.getNodeValue(XMLHandler.getSubNode(entrynode, \"filename2\")) == null) {\n    throw new IllegalArgumentException(\"filecompare entry missing filename1/filename2\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    jobEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n    logError(\"Corrupt filecompare entry XML: \" + e.getMessage(), e);\n    // fall back to defaults or skip the entry\n}","preventionTips":["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)"],"tags":["xml","deserialization","job-entry"],"backgroundTag":"xml-parse-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}