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;
};