{"record":{"id":"90fb33ffc297433c","repo":"pentaho/pentaho-kettle","slug":"jobentrydeletefolders-unabletoloadfromxml","errorCode":null,"errorMessage":"JobEntryDeleteFolders.UnableToLoadFromXml","messagePattern":"JobEntryDeleteFolders\\.UnableToLoadFromXml","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/deletefolders/JobEntryDeleteFolders.java","lineNumber":152,"sourceCode":"      super.loadXML( entrynode, databases, slaveServers );\n      argFromPrevious = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"arg_from_previous\" ) );\n      success_condition = XMLHandler.getTagValue( entrynode, \"success_condition\" );\n      limit_folders = XMLHandler.getTagValue( entrynode, \"limit_folders\" );\n\n      Node fields = XMLHandler.getSubNode( entrynode, \"fields\" );\n\n      // How many field arguments?\n      int nrFields = XMLHandler.countNodes( fields, \"field\" );\n      allocate( nrFields );\n\n      // Read them all...\n      for ( int i = 0; i < nrFields; i++ ) {\n        Node fnode = XMLHandler.getSubNodeByNr( fields, \"field\", i );\n\n        arguments[i] = XMLHandler.getTagValue( fnode, \"name\" );\n      }\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"JobEntryDeleteFolders.UnableToLoadFromXml\" ), 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      argFromPrevious = rep.getJobEntryAttributeBoolean( id_jobentry, \"arg_from_previous\" );\n      limit_folders = rep.getJobEntryAttributeString( id_jobentry, \"limit_folders\" );\n      success_condition = rep.getJobEntryAttributeString( id_jobentry, \"success_condition\" );\n\n      // How many arguments?\n      int argnr = rep.countNrJobEntryAttributes( id_jobentry, \"name\" );\n      allocate( argnr );\n\n      // Read them all...\n      for ( int a = 0; a < argnr; a++ ) {\n        arguments[a] = rep.getJobEntryAttributeString( id_jobentry, a, \"name\" );\n      }","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/deletefolders/JobEntryDeleteFolders.java#L134-L170","documentation":"Thrown when parsing the XML definition of a 'Delete Folders' job entry fails while reading its folder list. loadXML() wraps any KettleXMLException raised by XMLHandler navigation (missing 'fields' node, malformed 'field' children) into this message. The XML is corrupt or not the expected schema version.","triggerScenarios":"Calling loadXML() (via JobMeta.fromXMLString or loading a .kjb file) where the entry node lacks a well-formed <fields> block or contains malformed <field> elements, causing XMLHandler.getTagValue/getSubNodeByNr to throw.","commonSituations":"Hand-edited or truncated .kjb files; XML exported by an older/newer Pentaho version with a different schema; copy-paste corruption of job metadata; wrong node passed to loadXML.","solutions":["Validate the .kjb file is well-formed XML (xmllint) and the DeleteFolders entry has an intact <fields> section","Re-export/recreate the job entry from Spoon to regenerate correct XML","Check Pentaho version compatibility between the file producer and consumer","Inspect the chained KettleXMLException (xe) for the exact XPath/parse failure"],"exampleFix":"// before\nNode fields = XMLHandler.getSubNode(entrynode, \"fields\"); // NPE/malformed -> KettleXMLException\n// after\nNode fields = XMLHandler.getSubNode(entrynode, \"fields\");\nif (fields == null) {\n  throw new KettleXMLException(\"Missing <fields> node in DeleteFolders entry\");\n}\nint nrFields = XMLHandler.countNodes(fields, \"field\");","handlingStrategy":"try-catch","validationCode":"// before loadXML\nDocument doc = XMLHandler.loadXMLFile(new File(kjbPath)); // throws if not well-formed\nNode entry = XMLHandler.getSubNode(doc.getDocumentElement(), \"entry\");\nif (XMLHandler.getSubNode(entry, \"fields\") == null) {\n  throw new IllegalArgumentException(\"DeleteFolders entry missing <fields> node\");\n}","typeGuard":"boolean hasFieldsNode(Node entrynode) {\n  return entrynode != null && XMLHandler.getSubNode(entrynode, \"fields\") != null;\n}","tryCatchPattern":"try {\n  entry.loadXML(entrynode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n  logError(\"DeleteFolders XML invalid: \" + e.getMessage(), e.getCause());\n  throw e;\n}","preventionTips":["Never hand-edit .kjb files; edit via Spoon","Validate XML with xmllint after external generation","Keep Pentaho versions consistent across environments","Keep .kjb files under version control to detect truncation"],"tags":["kettle","xml","parsing","job-entry"],"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"}