getNodeSequence.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. export default function getNodeSequence(xmlObj) {
  2. if (!xmlObj.childNodes[0].childNodes[0]) return [];
  3. let nodeList = Array.from(xmlObj.childNodes[0].childNodes[0].childNodes)
  4. let res = [];
  5. let startNode = nodeList.find((item) => item.tagName == 'bpmn:startEvent');
  6. if (!startNode) {
  7. console.log('缺少开始节点');
  8. return;
  9. }
  10. let nextNodeId = getNodeId(startNode, true, nodeList);
  11. res.push({
  12. nodeId: startNode.id,
  13. preNodeId: null,
  14. nextNodeId: nextNodeId,
  15. })
  16. while (nextNodeId) {
  17. if (!nextNodeId) break
  18. let currentId = nextNodeId;
  19. let currentNode = nodeList.find(item => item.id == currentId);
  20. nextNodeId = getNodeId(currentNode, true, nodeList);
  21. let preNodeId = getNodeId(currentNode, false, nodeList);
  22. res.push(
  23. {
  24. nodeId: currentId,
  25. preNodeId,
  26. nextNodeId,
  27. }
  28. )
  29. }
  30. console.log(res);
  31. return res
  32. }
  33. /**
  34. *
  35. * @param {节点} node
  36. * @param {true:下一个节点的id;false:上一个节点的id} flag
  37. * @returns
  38. */
  39. const getNodeId = (node, flag, nodeList) => {
  40. let theTagName = flag ? 'bpmn:outgoing' : 'bpmn:incoming';
  41. let childNodeList = Array.from(node.childNodes);
  42. let FlowId = childNodeList.find(item => item.tagName == theTagName)?.firstChild?.data;//找到指入或指出箭头节点
  43. if (!FlowId) return false;
  44. let targetId = nodeList.find(item => item.id == FlowId)?.getAttribute(flag ? 'targetRef' : 'sourceRef')
  45. if (!targetId) return false;
  46. return targetId;
  47. }