{"record":{"id":"6f9644968a356580","repo":"pentaho/pentaho-kettle","slug":"rulesmeta-error-loadfromxml","errorCode":"RulesMeta.Error.LoadFromXML","errorMessage":"RulesMeta.Error.LoadFromXML","messagePattern":"RulesMeta\\.Error\\.LoadFromXML","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"plugins/drools/core/src/main/java/org/pentaho/di/trans/steps/rules/RulesAccumulatorMeta.java","lineNumber":146,"sourceCode":"    try {\n      Node fields = XMLHandler.getSubNode( stepnode, StorageKeys.NODE_FIELDS.toString() );\n      int nrfields = XMLHandler.countNodes( fields, StorageKeys.SUBNODE_FIELD.toString() );\n\n      ValueMetaInterface vm = null;\n      for ( int i = 0; i < nrfields; i++ ) {\n        Node fnode = XMLHandler.getSubNodeByNr( fields, StorageKeys.SUBNODE_FIELD.toString(), i );\n\n        String name = XMLHandler.getTagValue( fnode, StorageKeys.COLUMN_NAME.toString() );\n        int type = ValueMeta.getType( XMLHandler.getTagValue( fnode, StorageKeys.COLUMN_TYPE.toString() ) );\n        vm = ValueMetaFactory.createValueMeta( name, type );\n\n        getRuleResultColumns().add( vm );\n      }\n\n      setRuleFile( XMLHandler.getTagValue( stepnode, StorageKeys.RULE_FILE.toString() ) );\n      setRuleDefinition( XMLHandler.getTagValue( stepnode, StorageKeys.RULE_DEFINITION.toString() ) );\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString( PKG, \"RulesMeta.Error.LoadFromXML\" ), e );\n    }\n  }\n\n  @Override\n  public String getXML() {\n    StringBuffer retval = new StringBuffer( 300 );\n\n    retval.append( \"    <\" + StorageKeys.NODE_FIELDS + \">\" ).append( Const.CR );\n    for ( int i = 0; i < ruleResultColumns.size(); i++ ) {\n      retval.append( \"      <\" + StorageKeys.SUBNODE_FIELD + \">\" ).append( Const.CR );\n      retval.append( \"        \" ).append(\n        XMLHandler.addTagValue( StorageKeys.COLUMN_NAME.toString(), ruleResultColumns.get( i ).getName() ) );\n      retval.append( \"        \" ).append(\n        XMLHandler.addTagValue( StorageKeys.COLUMN_TYPE.toString(), ruleResultColumns.get( i ).getTypeDesc() ) );\n      retval.append( \"      </\" + StorageKeys.SUBNODE_FIELD + \">\" ).append( Const.CR );\n    }\n    retval.append( \"    </\" + StorageKeys.NODE_FIELDS + \">\" ).append( Const.CR );\n    retval.append( \"    \" ).append( XMLHandler.addTagValue( StorageKeys.RULE_FILE.toString(), getRuleFile() ) );","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/drools/core/src/main/java/org/pentaho/di/trans/steps/rules/RulesAccumulatorMeta.java#L128-L164","documentation":"RulesAccumulatorMeta.loadXML() deserializes the step's saved configuration from a .ktr XML document: it reads the <fields> node, creates a ValueMetaInterface per <field> child (via ValueMetaFactory.createValueMeta with the type parsed from column-type), and reads rule-file / rule-definition tags. Any exception in this block is wrapped in a KettleXMLException with the i18n message \"RulesMeta.Error.LoadFromXML\". It means the step definition stored in the transformation XML could not be loaded.","triggerScenarios":"KettleXMLException thrown when loading a Rule Accumulator step from a transformation XML: malformed <fields> structure (e.g. fields node null leading to NPE in countNodes/getSubNodeByNr), a column-type string that ValueMeta.getType()/ValueMetaFactory cannot map to a value type, createValueMeta failing for an unsupported type, or XMLHandler throwing while parsing rule-file/rule-definition tags.","commonSituations":"Opening a .ktr file produced by a newer/older PDI version with changed step XML schema; hand-edited transformation XML with a typo in column-type (e.g. \"Intr\" instead of \"Integer\"); corrupted or partially written transformation file; XML missing the <fields> block entirely.","solutions":["Inspect the 'cause' of the KettleXMLException (getCause()) — it contains the real error, e.g. the unmapped value-type name.","Open the .ktr in a text editor and check the step's <fields>/<field> entries: verify each column-type is a valid PDI value type name (String, Integer, Number, Boolean, Date, ...).","Recreate the step in Spoon and re-save if the XML is from an incompatible PDI version; migrate the transformation instead of hand-editing.","Check for NPE caused by a missing <fields> node and add/repair the node structure.","Ensure the transformation file is complete and not truncated/corrupted (re-export or restore from backup)."],"exampleFix":"<!-- before: invalid column type in the .ktr -->\n<field>\n  <column-name>total</column-name>\n  <column-type>Intr</column-type>\n</field>\n\n<!-- after -->\n<field>\n  <column-name>total</column-name>\n  <column-type>Integer</column-type>\n</field>","handlingStrategy":"try-catch","validationCode":"// Before loading from XML, validate the step node structure\nNode fields = XMLHandler.getSubNode(stepnode, \"fields\");\nif (fields == null) throw new IllegalArgumentException(\"step XML missing <fields> node\");\nfor (int i = 0; i < XMLHandler.countNodes(fields, \"field\"); i++) {\n  Node f = XMLHandler.getSubNodeByNr(fields, \"field\", i);\n  String type = XMLHandler.getTagValue(f, \"column-type\");\n  if (ValueMeta.getType(type) == ValueMetaInterface.TYPE_NONE)\n    throw new IllegalArgumentException(\"unmapped column-type: \" + type);\n}","typeGuard":"boolean hasValidFieldsNode(Node stepnode) {\n  Node fields = XMLHandler.getSubNode(stepnode, \"fields\");\n  if (fields == null) return false;\n  for (int i = 0; i < XMLHandler.countNodes(fields, \"field\"); i++) {\n    String type = XMLHandler.getTagValue(XMLHandler.getSubNodeByNr(fields, \"field\", i), \"column-type\");\n    if (type == null || ValueMeta.getType(type) < 0) return false;\n  }\n  return true;\n}","tryCatchPattern":"try {\n  meta.loadXML(stepnode, databases, metaStore);\n} catch (KettleXMLException e) {\n  logError(\"Failed to load Rule Accumulator step XML: \" + e.getCause(), e);\n  throw new KettleXMLException(\"Step XML invalid; check <fields> entries and column-type values\", e);\n}","preventionTips":["Never hand-edit .ktr XML; configure steps through Spoon","Use only documented PDI value-type names in column-type tags","Keep transformations in version control to recover from corruption","When upgrading PDI versions, migrate transformations via the supported path"],"tags":["kettle","xml","deserialization","step-metadata","transformation"],"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"}