pentaho/pentaho-kettle · error · KettleXMLException
JobEntryMSAccessBulkLoad.Meta.UnableLoadXML
JobEntryMSAccessBulkLoad.Meta.UnableLoadXML
Error message
JobEntryMSAccessBulkLoad.Meta.UnableLoadXML
What it means
KettleXMLException thrown by JobEntryMSAccessBulkLoad.loadXML when the job entry's XML definition cannot be parsed into the entry's fields (files, wildcards, delimiters, target db/table). It wraps the underlying parse exception and localizes the message via the ms-access messages package. The job entry metadata is unusable until the XML is fixed.
Solutions
- Open the .kjb file in a text editor and validate/correct the <entry> XML block for the MS Access bulk load node (check tags source_wildcard, delimiter, target_db, target_table).
- Re-open the job in Spoon, delete and re-create the MS Access Bulk Load job entry so Spoon regenerates a valid XML block.
- Check Pentaho/PDI version compatibility: the job file may come from a newer PDI release; upgrade the server or re-export from the matching version.
- If the exception message doesn't pinpoint the cause, inspect the wrapped KettleXMLException cause (xe.getMessage()) for the exact XMLHandler failure.
Example fix
// before (hand-edited .kjb, tag renamed by mistake) <file><source_wild Card>/*.mdb</source_wildCard></file> // after <file><source_wildcard>/*.mdb</source_wildcard><delimiter>;</delimiter><target_db>output.mdb</target_db><target_table>TARGET</target_table></file>
Defensive patterns
Strategy: try-catch
Try / catch
try { jobEntry.loadXML( stepnode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( "Bad MS Access bulk load XML: " + e.getCause(), e ); /* re-create entry or repair .kjb */ } Prevention
- Don't hand-edit the <entry> XML block of the MS Access bulk load node; edit via Spoon
- Keep PDI versions consistent between designers and servers
- Keep .kjb files under version control to diff accidental tag changes
- Always check the cause chain for the underlying XMLHandler error
When it happens
Trigger: Calling loadXML(Node stepnode, ...) with a malformed or unexpected XML node: missing 'files'/'file' sub-elements, wrong tag names (source_wildcard, delimiter, target_db, target_table), or a node structure produced by a different plugin version.
Common situations: Hand-editing a .kjb job file and corrupting the MS Access bulk load entry XML; opening a job exported from a newer/older Pentaho version where tag names changed; truncated or encoding-damaged .kjb files; repository round-trips that mangle the node tree.
Related errors
- JobCopyFiles.Error.Exception.UnableLoadXML
- JobEntryCopyMoveResultFilenames.CanNotLoadFromXML
- ProcessFilesMeta.Exception.UnableToReadStepInfo
- Unable to load job entry of type 'create file' from XML node
- Unable to load job entry of type 'create folder' from XML…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/8a469856aed8a5fb.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/ms-access/impl/src/main/java/org/pentaho/di/job/entries/msaccessbulkload/JobEntryMSAccessBulkLoad.java:200
int nrFields = XMLHandler.countNodes( fields, "field" );
source_filefolder = new String[nrFields];
delimiter = new String[nrFields];
source_wildcard = new String[nrFields];
target_Db = new String[nrFields];
target_table = new String[nrFields];
// Read them all...
for ( int i = 0; i < nrFields; i++ ) {
Node fnode = XMLHandler.getSubNodeByNr( fields, "field", i );
source_filefolder[i] = XMLHandler.getTagValue( fnode, "source_filefolder" );
source_wildcard[i] = XMLHandler.getTagValue( fnode, "source_wildcard" );
delimiter[i] = XMLHandler.getTagValue( fnode, "delimiter" );
target_Db[i] = XMLHandler.getTagValue( fnode, "target_db" );
target_table[i] = XMLHandler.getTagValue( fnode, "target_table" );
}
} catch ( KettleXMLException xe ) {
throw new KettleXMLException( BaseMessages.getString( PKG, "JobEntryMSAccessBulkLoad.Meta.UnableLoadXML", xe
.getMessage() ), xe );
}
}
public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,
List<SlaveServer> slaveServers ) throws KettleException {
try {
include_subfolders = rep.getJobEntryAttributeBoolean( id_jobentry, "include_subfolders" );
add_result_filenames = rep.getJobEntryAttributeBoolean( id_jobentry, "add_result_filenames" );
is_args_from_previous = rep.getJobEntryAttributeBoolean( id_jobentry, "is_args_from_previous" );
limit = rep.getJobEntryAttributeString( id_jobentry, "limit" );
success_condition = rep.getJobEntryAttributeString( id_jobentry, "success_condition" );
// How many arguments?
int argnr = rep.countNrJobEntryAttributes( id_jobentry, "source_filefolder" );
source_filefolder = new String[argnr];
source_wildcard = new String[argnr];View on GitHub (pinned to f3058517a1)