pentaho/pentaho-kettle · error · KettleXMLException
SynchronizeAfterMergeMeta.Exception.UnableToReadStepInfoFrom…
Error message
SynchronizeAfterMergeMeta.Exception.UnableToReadStepInfoFromXML
What it means
SynchronizeAfterMergeMeta.readData() failed while parsing the step's XML definition (as loaded by loadXML) into step metadata. Any exception during XML attribute reading (missing nodes, malformed values, wrong element structure) is wrapped in KettleXMLException 'Unable to read step info from XML'.
Solutions
- Open the .ktr in the PDI version it was created with, or upgrade Spoon to a compatible version
- Inspect the .ktr XML around the SynchronizeAfterMerge <fields> element and repair/normalize it (compare with a working step's XML)
- Recreate the step in a fresh transformation and re-enter the settings
- Check the cause ('Caused by') in the stack trace to identify the exact parse failure
Example fix
// before (hand-edited ktr, missing value_update element) <field><value_name>AMOUNT</value_name><value_rename>amount</value_rename></field> // after <field><update>true</update><value_name>AMOUNT</value_name><value_rename>amount</value_rename></field>
Defensive patterns
Strategy: try-catch
Validate before calling
// Validate XML before loading
try { javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(ktrPath)); }
catch (org.xml.sax.SAXException e) { throw new IllegalStateException("Malformed ktr XML: " + ktrPath, e); } Try / catch
try { transMeta = new TransMeta(ktrPath); }
catch (KettleXMLException e) { log.error("Cannot read step from XML (check PDI version / ktr integrity): " + e.getMessage(), e); throw new IllegalStateException("Transformation file incompatible or corrupt", e); } Prevention
- Never hand-edit .ktr files; use Spoon
- Open transformations with a PDI version compatible with the one that saved them
- Back up .ktr files before scripted edits
- Verify file integrity after transfers (checksums)
When it happens
Trigger: Loading a .ktr file whose <fields> section for this step is malformed or from an incompatible plugin version; a repository/XML import of a transformation saved by a different Pentaho version with changed XML schema.
Common situations: Hand-editing a .ktr file and breaking the XML; opening transformations built in much older/newer PDI versions; incomplete file transfer truncating the XML.
Understand the failure class
Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.
Related errors
- CubeInputMeta.Exception.UnableToLoadStepInfo
- InsertUpdateMeta.Exception.UnableToReadStepInfoFromXML
- JobEntryMSAccessBulkLoad.Meta.UnableLoadXML
- LoadFileInputMeta.Exception.ErrorLoadingXML
- ProcessFilesMeta.Exception.UnableToReadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/c5d4387a27f34be6.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:468
updateLookup[i] = XMLHandler.getTagValue( vnode, "name" );
updateStream[i] = XMLHandler.getTagValue( vnode, "rename" );
if ( updateStream[i] == null ) {
updateStream[i] = updateLookup[i]; // default: the same name!
}
String updateValue = XMLHandler.getTagValue( vnode, "update" );
if ( updateValue == null ) {
// default TRUE
update[i] = Boolean.TRUE;
} else {
if ( updateValue.equalsIgnoreCase( "Y" ) ) {
update[i] = Boolean.TRUE;
} else {
update[i] = Boolean.FALSE;
}
}
}
} catch ( Exception e ) {
throw new KettleXMLException( BaseMessages.getString(
PKG, "SynchronizeAfterMergeMeta.Exception.UnableToReadStepInfoFromXML" ), e );
}
}
public void setDefault() {
tablenameInField = false;
tablenameField = null;
keyStream = null;
updateLookup = null;
databaseMeta = null;
commitSize = "100";
schemaName = "";
tableName = BaseMessages.getString( PKG, "SynchronizeAfterMergeMeta.DefaultTableName" );
operationOrderField = null;
OrderInsert = null;
OrderUpdate = null;
OrderDelete = null;
performLookup = false;View on GitHub (pinned to f3058517a1)