{"record":{"id":"e91d77f649c119f4","repo":"pentaho/pentaho-kettle","slug":"jobentryaddresultfilenames-unabletoloadfromxml","errorCode":null,"errorMessage":"JobEntryAddResultFilenames.UnableToLoadFromXml","messagePattern":"JobEntryAddResultFilenames\\.UnableToLoadFromXml","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/job/entries/addresultfilenames/JobEntryAddResultFilenames.java","lineNumber":147,"sourceCode":"      includeSubfolders = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"include_subfolders\" ) );\n      deleteallbefore = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"delete_all_before\" ) );\n\n      Node fields = XMLHandler.getSubNode( entrynode, \"fields\" );\n\n      // How many field arguments?\n      int nrFields = XMLHandler.countNodes( fields, \"field\" );\n      arguments = new String[nrFields];\n      filemasks = new String[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        filemasks[i] = XMLHandler.getTagValue( fnode, \"filemask\" );\n      }\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException(\n        BaseMessages.getString( PKG, \"JobEntryAddResultFilenames.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      includeSubfolders = rep.getJobEntryAttributeBoolean( id_jobentry, \"include_subfolders\" );\n\n      deleteallbefore = rep.getJobEntryAttributeBoolean( id_jobentry, \"delete_all_before\" );\n\n      // How many arguments?\n      int argnr = rep.countNrJobEntryAttributes( id_jobentry, \"name\" );\n      arguments = new String[argnr];\n      filemasks = new String[argnr];\n\n      // Read them all...","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/job/entries/addresultfilenames/JobEntryAddResultFilenames.java#L129-L165","documentation":"JobEntryAddResultFilenames.loadXML throws KettleXMLException wrapping this message when parsing the job entry's XML <fields> section fails. The library throws it to preserve the cause while reporting that this specific job entry could not be deserialized from a .kjb file.","triggerScenarios":"Calling loadXML with a malformed or unexpected XML node: a missing/corrupt <field> subnode, or XMLHandler.getTagValue returning data that breaks parsing (e.g. truncated file, wrong element nesting).","commonSituations":"Hand-edited or partially written .kjb files, files generated by newer Pentaho versions loaded in an older one, or corrupted XML during version control merges.","solutions":["Open the .kjb file in Spoon and fix or delete the AddResultFilenames entry that fails to load.","Validate the XML is well-formed (xmllint) and that each <field> node has <name> and <filemask> children.","Recreate the job entry in the designer so it serializes fresh XML."],"exampleFix":"// before\nNode fnode = XMLHandler.getSubNodeByNr( fields, \"field\", i ); // fields may be null\n// after\nNode fields = XMLHandler.getSubNode( entrynode, \"fields\" );\nint nrFields = fields != null ? XMLHandler.countNodes( fields, \"field\" ) : 0;","handlingStrategy":"try-catch","validationCode":"// pre-validate XML before loadXML\nDocument doc = XMLHandler.loadXMLFile( new File( kjbPath ) );\nNode fields = XMLHandler.getSubNode( XMLHandler.getSubNode( doc, \"entry\" ), \"fields\" );\nif ( fields == null || XMLHandler.countNodes( fields, \"field\" ) == 0 ) { throw new IllegalStateException( \"no <field> nodes\" ); }","typeGuard":"boolean isValidFieldsNode(Node n) { return n != null && XMLHandler.countNodes( n, \"field\" ) > 0; }","tryCatchPattern":"try { entry.loadXML( entrynode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( \"AddResultFilenames XML invalid: \" + e.getMessage(), e ); /* fall back to defaults or re-create entry */ }","preventionTips":["Never hand-edit .kjb XML; edit via Spoon.","Resolve VCS merges on job files by regenerating from the designer.","Keep PDI designer and runtime versions aligned."],"tags":["xml","job-entry","deserialization","kettle"],"backgroundTag":"xml-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"}