{"record":{"id":"a99110d5e6d7f77e","repo":"pentaho/pentaho-kettle","slug":"jobfolderscompare-meta-unableloadxml","errorCode":null,"errorMessage":"JobFoldersCompare.Meta.UnableLoadXML","messagePattern":"JobFoldersCompare\\.Meta\\.UnableLoadXML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/folderscompare/JobEntryFoldersCompare.java","lineNumber":138,"sourceCode":"      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      includesubfolders = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"include_subfolders\" ) );\n      comparefilecontent = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"compare_filecontent\" ) );\n      comparefilesize = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"compare_filesize\" ) );\n\n      compareonly = XMLHandler.getTagValue( entrynode, \"compareonly\" );\n      wildcard = XMLHandler.getTagValue( entrynode, \"wildcard\" );\n      filename1 = XMLHandler.getTagValue( entrynode, \"filename1\" );\n      filename2 = XMLHandler.getTagValue( entrynode, \"filename2\" );\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"JobFoldersCompare.Meta.UnableLoadXML\", xe\n        .getMessage() ) );\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      includesubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, \"include_subfolders\" );\n      comparefilecontent = rep.getJobEntryAttributeBoolean( id_jobentry, \"compare_filecontent\" );\n      comparefilesize = rep.getJobEntryAttributeBoolean( id_jobentry, \"compare_filesize\" );\n\n      compareonly = rep.getJobEntryAttributeString( id_jobentry, \"compareonly\" );\n      wildcard = rep.getJobEntryAttributeString( id_jobentry, \"wildcard\" );\n      filename1 = rep.getJobEntryAttributeString( id_jobentry, \"filename1\" );\n      filename2 = rep.getJobEntryAttributeString( id_jobentry, \"filename2\" );\n    } catch ( KettleException dbe ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"JobFoldersCompare.Meta.UnableLoadRep\", \"\"\n        + id_jobentry, dbe.getMessage() ) );","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/folderscompare/JobEntryFoldersCompare.java#L120-L156","documentation":"Thrown by JobEntryFoldersCompare.loadXML when parsing the job entry's XML node fails with a KettleXMLException. The message is a localized bundle key (JobFoldersCompare.Meta.UnableLoadXML) with the original message substituted. It means the 'Compare Folders' entry could not be read from a .kjb XML document.","triggerScenarios":"Calling loadXML on JobEntryFoldersCompare when XMLHandler.getTagValue/getSubNode throws KettleXMLException — malformed XML, wrong node structure, or an XML parsing error inside the entry's <entry> block.","commonSituations":"Hand-edited .kjb files with invalid XML; job files truncated by a failed transfer; version drift where the XML schema changed; copy-pasting an entry node from another job with mismatched tags.","solutions":["Open the .kjb file in an XML validator/editor and fix the malformed entry node (compareonly, wildcard, filename1, filename2 tags).","Check xe.getMessage() in the wrapped exception for the exact XML parse error and line.","Re-export the job from Spoon to regenerate valid XML.","Ensure the file encoding matches the declared encoding (UTF-8) and the file is not truncated."],"exampleFix":"// before: hand-edited node missing closing tag\n<folders_compare><filename1>/a</filename1>\n// after: valid complete node\n<folders_compare>\n  <compareonly>N</compareonly>\n  <filename1>/data/a</filename1>\n  <filename2>/data/b</filename2>\n</folders_compare>","handlingStrategy":"validation","validationCode":"// validate XML before loading\nDocument doc = XMLHandler.loadXMLFile(kjbInputStream);\nif (doc == null) throw new KettleException(\"Invalid or empty .kjb XML\");\nNode entryNode = XMLHandler.getSubNode(doc, \"entry\");\nif (entryNode == null) throw new KettleException(\"Missing <entry> node\");","typeGuard":null,"tryCatchPattern":"try {\n  entry.loadXML(entryNode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n  logError(\"FoldersCompare XML load failed: \" + e.getMessage());\n  // fix or re-export the .kjb file\n}","preventionTips":["Never hand-edit .kjb files; edit in Spoon only.","Run XML files through a validator after any external manipulation.","Transfer .kjb files in binary mode to avoid truncation/encoding damage.","Pin Pentaho versions between export and load to avoid schema drift."],"tags":["kettle","xml","job-entry","parsing"],"backgroundTag":"json-parse-error","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"}