升级bpmn-js至0.26.6后导出XML含无效$type属性问题求助
解决bpmn-js 0.26.6升级后SequenceFlow出现$type属性的问题
我之前维护BPMN流程编辑器时,刚好碰到过和你完全一样的问题!当时升级bpmn-js到0.26.6后,导出的XML里所有<bpmn:sequenceFlow>标签都被自动加上了$type="bpmn:SequenceFlow"属性,直接导致XML校验失败,折腾了好一阵才找到根源。
可能的原因和排查方向
- 依赖版本不匹配:bpmn-js核心依赖
bpmn-moddle来处理BPMN模型的序列化/反序列化。0.26.6版本的bpmn-js对应的bpmn-moddle版本有特定要求,如果你的项目里bpmn-moddle版本太旧或者太新,就可能出现序列化逻辑异常,额外输出$type属性。你可以去查看bpmn-js@0.26.6的package.json文件,确认它指定的bpmn-moddle版本,然后把项目里的依赖同步到对应版本试试。 - 自定义序列化逻辑干扰:如果你在生成XML时用了自定义的处理逻辑(比如手动修改模型元素后再导出),可能不小心触发了模型的内部标记,导致序列化时输出
$type。检查一下你调用modeler.saveXML()前后的代码,有没有对SequenceFlow元素做过额外属性设置。 - 插件/扩展冲突:如果你的项目里集成了自定义的bpmn-js插件或者BPMN扩展,升级后这些插件可能和新版本的核心库逻辑冲突,导致序列化异常。可以暂时禁用所有自定义插件,再导出XML看看是否还会出现这个问题,逐步排查出冲突的插件。
临时修复方案(如果紧急需要解决)
如果暂时找不到根源,可以在导出XML后做一次字符串处理,批量移除这个非法属性:
modeler.saveXML({ format: true }, (err, xml) => { if (err) { // 处理错误 return; } // 移除所有$type="bpmn:SequenceFlow"属性 const cleanedXml = xml.replace(/\$type="bpmn:SequenceFlow"/g, ''); // 使用cleanedXml做后续处理 });
不过这只是权宜之计,还是建议找到根源解决,避免后续出现其他兼容性问题。
我当时的问题就是bpmn-moddle版本没跟上,同步升级到bpmn-js指定的版本后,这个问题就完全消失了,你可以先从这个方向排查试试!
内容的提问来源于stack exchange,提问作者Nacho321




