当前位置: 首页 > news >正文

logicflow 操作xml文件 为bpmn:serviceTask标签里存在title匹配的内容后添加指定标签内容。

logicflow 操作xml文件 为bpmn:serviceTask标签里存在title匹配的内容后添加指定标签内容。
bpmn文档:https://tkjohn.github.io/flowable-userguide/#bpmn20
logicflow文档:https://site.logic-flow.cn/tutorial/about

export var intermediateCatchFunction = (xmlString) => {// 创建 DOMParser 实例const parser = new DOMParser();// 解析 XML 字符串const xmlDoc = parser.parseFromString(xmlString, "text/xml");// 查找所有 bpmn:serviceTask 标签const serviceTasks = xmlDoc.getElementsByTagName('bpmn:serviceTask');// 遍历所有 bpmn:serviceTask 标签for (let i = 0; i < serviceTasks.length; i++) {const task = serviceTasks[i];const title = task.getAttribute('flowable:title');// 封装创建事件和信号定义的函数function createEventAndSignal(id, name, signalRef) {const lineBreakBefore = xmlDoc.createTextNode('\t\n');const lineBreakAfter = xmlDoc.createTextNode('\t\n');// 创建 intermediateCatchEvent 标签const intermediateCatchEvent = xmlDoc.createElement('bpmn:intermediateCatchEvent');intermediateCatchEvent.setAttribute('id', id);intermediateCatchEvent.setAttribute('name', name);// 创建 signalEventDefinition 标签const signalEventDefinition = xmlDoc.createElement('bpmn:signalEventDefinition');signalEventDefinition.setAttribute('signalRef', signalRef);// 将 signalEventDefinition 插入到 intermediateCatchEvent 中intermediateCatchEvent.appendChild(signalEventDefinition);// 在找到的标签后插入新标签if (task.nextSibling) {task.parentNode.insertBefore(lineBreakBefore, task.nextSibling);task.parentNode.insertBefore(intermediateCatchEvent, task.nextSibling.nextSibling);task.parentNode.insertBefore(lineBreakAfter, task.nextSibling.nextSibling.nextSibling);} else {task.parentNode.appendChild(lineBreakBefore);task.parentNode.appendChild(intermediateCatchEvent);task.parentNode.appendChild(lineBreakAfter);}const definitionsElement = xmlDoc.getElementsByTagName('bpmn:definitions')[0];const newSignalEventDefinition = xmlDoc.createElement('bpmn:signal');newSignalEventDefinition.setAttribute('id', signalRef);newSignalEventDefinition.setAttribute('name', name);const definitionsLineBreakBefore = xmlDoc.createTextNode('\t\n');const definitionsLineBreakAfter = xmlDoc.createTextNode('\t\n');// 找到合适的插入位置,这里假设插入到第一个子元素之前if (definitionsElement.firstChild) {definitionsElement.insertBefore(definitionsLineBreakBefore, definitionsElement.firstChild);definitionsElement.insertBefore(newSignalEventDefinition, definitionsElement.firstChild.nextSibling);definitionsElement.insertBefore(definitionsLineBreakAfter, definitionsElement.firstChild.nextSibling.nextSibling);} else {definitionsElement.appendChild(definitionsLineBreakBefore);definitionsElement.appendChild(newSignalEventDefinition);definitionsElement.appendChild(definitionsLineBreakAfter);}}// 判断 flowable:title 是否等于 "企业微信"if (title === '企业微信') {createEventAndSignal('xxx', 'xxx0', 'xxx1');}// 判断 flowable:title 是否等于 "公众号"if (title === '公众号') {createEventAndSignal('xxx', 'xxx0', 'xxx1');}// 判断 flowable:title 是否等于 "小程序"if (title === '小程序') {createEventAndSignal('xxx', 'xxx0', 'xxx1');}// 判断 flowable:title 是否等于 "短信"if (title === '短信') {createEventAndSignal('xxx', 'xxx0', 'xxx1');}}// 将修改后的 XML 转换为字符串const serializer = new XMLSerializer();const newXmlString = serializer.serializeToString(xmlDoc);// 输出修改后的 XML 字符串return newXmlString;
};

相关文章:

  • 智能手表测试用例文档
  • MySQL 事务(一)
  • bootstrap自助(抽样)法
  • 第三章 仿真器介绍
  • python opencv 将不同shape尺寸的图片制作video视频
  • 掌握MySQL数据库操作:从创建到管理全攻略
  • 《Spring Boot 4.0新特性深度解析》
  • 基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器(项目推介)
  • Leetcode-BFS问题
  • 微信小程序单双周选择排序有效果图
  • Django 项目的 models 目录中,__init__.py 文件的作用
  • PyTorch Lightning实战 - 训练 MNIST 数据集
  • 【Java学习】Lambda表达式
  • day 23
  • 嵌入式MCU和Linux开发哪个好?
  • 架构思维:通用架构模式_系统监控的设计
  • 《微机原理与接口技术》第 5 章 汇编语言程序设计
  • 解决LangChain4j报错HTTP/1.1 header parser received no bytes
  • OJ项目测试
  • C++类和对象--中阶
  • 甘肃:今年6月前,由县级党委、政府制定农村彩礼倡导性标准
  • 香港将展“天方奇毯”,从地毯珍品看伊斯兰艺术
  • 人民日报整版聚焦:专家学者看2025中国经济增长点
  • 10名“鬼火少年”凌晨结队在城区飙车,警方:涉非法改装,正处理
  • 重庆一高校75万采购市价299元产品?工作人员:正在处理
  • 第19届威尼斯建筑双年展开幕,中国案例呈现“容·智慧”