为什么工作流中围绕XML做EDI报文数据解析/生成?
经常有客户问起,为什么在处理EDI文件时不一次到位,而需要使用多个端口来分次进行处理呢,是不是想要多占用几个端口好多卖钱呀?
实际上,在一开始的知行EDI产品中,功能还没有这么完善,当时只支持EDI常见的传输协议,那个时候我们在做报文翻译时,还不能仅通过简单的配置来实现,需要手写代码,去读取报文,然后获取每一行的数据,再逐一去读对应的业务值。参考之前的实施经验,觉得实施过程漫长、前期开发代码量大、后期维护成本也高,经过产品部门多次考量,在一次次的产品升级过程中,不停的进行功能新增、完善,才形成了现在这样的一套报文处理模式。
那么,到底是不是直接对报文进行处理更简单呢?
假设我们现在通过AS2传输,接收850采购订单EDI报文,采用自定义XML方案。
直接处理EDI报文
我们来回顾一下直接处理业务报文的步骤:
首先,通过AS2收到850采购订单后,要直接进行处理,完成报文翻译,我们的代码逻辑大约如下:
- 先读取当前850采购订单报文的内容
- 对内容进行分割,将850采购订单的内容按照节点分割,例如:ST节点,BEG节点等等,每个节点代表不同的信息
- 开始逐一读取节点,匹配节点所属的业务含义,并将每个节点中的详细业务数据读取出来
- 一边读取数据,一边输出自定义XML
- 调试程序,确认业务逻辑和取值正确
以上步骤中我们可以看出,所有的处理都要使用代码来实现,那么代码量一定是非常大的。同时,因为EDI报文中数据比较多,而且结构复杂,所以代码逻辑也会非常复杂。在初步完成代码之后,后续的业务测试过程中,若是因为对EDI报文理解不到位,想要修改某一部分的处理逻辑或是取值方式,将会造成很大的工作量,而且往往都是牵一发而动全身,修改可能会造成其他本来正确的数据出错。同时,在切换生产环境之后,如果贸易合作伙伴对EDI规范做了某些升级或者调整,后来的维护人员需要将整个的代码整体通读一遍,完全理解之后,才能进行修改。
分步处理EDI报文
如果在目前的知行EDI产品中,我们分多个端口去完成报文翻译,每个端口都只负责各自的功能部分,那么整体步骤如下:
- AS2端口收到850采购订单后,直接转发到X12端口(直接配置实现)
- X12端口将EDI报文转换为标准XML,并转发到XMLMap端口(直接配置实现)
- XMLMap端口通过界面拖拽,并辅以少许简单code,实现转换为自定义XML文件(简单coding)
以上步骤中我们可以看出,通过这种方式,一方面,代码量非常少,大家知道,写的越多,容易出错的地方越多,代码量少了,大部分功能依赖于产品,所以出错概率会降低。如果有EDI报文结构更改或是升级的情况,前两步我们不用做任何修改,只要在最后一步,仅修改需要调整的部分即可。
标准XML文件
在知行EDI系统中,几乎所有的EDI报文处理都是以标准XML文件为媒介的。
XML(可扩展标记语言)是一种标记语言,提供了一种简单,灵活的文本格式。XML描述文档的数据结构,并为所有其他规范提供通用语法。XML的主要应用程序之一就是处理B2B和B2C数据交换。
这是部分EDI报文采购订单和标准XML采购订单:
850 原始EDI文件:
...
BEG*00*DS*0476696888**20150708~
REF*SB*ZZ11~
REF*6P*ZZ~
...
经X12端口标准XML:
...
<BEG type="Segment"><!--Transaction Set Purpose Code--><BEG01>
<!--Original-->00</BEG01>
<!--Purchase Order Type Code--><BEG02>
<!--Dropship-->DS</BEG02>
<!--Purchase Order Number--><BEG03>0476696888</BEG03>
<!--Release Number--><BEG04 xsi:nil="true"/>
<!--Date--><BEG05>20150708</BEG05>
</BEG>
<REF type="Segment">
<!--Reference Identification Qualifier--><REF01><!--Sales Region Number-->SB</REF01>
<!--Reference Identification--><REF02>ZZ11</REF02>
</REF>
...
我们可以看出,标准XML包含解释每个节点含义的注释。最重要的是,对于标准XML文件,可以直接将其映射到目标格式,而不必查找EDI文档中每个节点的含义,只需参考标准XML文档中提供的说明和贸易伙伴提供的规范即可。
显而易见,在处理EDI报文时,并不是直接对EDI报文进行处理一步到位就更好。先将EDI报文转换为标准XML,再对标准XML进行后续处理存在以下优点:
-
代码逻辑简单,工作量较小
-
可以自动检查贸易合作伙伴传来的EDI报文是否符合国际标准
-
易于调试,进行业务测试
-
易于后期维护
-
易于和其他目标格式文档做转换,比如自定义XML,CSV,PSV,Excel等
-
增加功能模块的独立性,降低耦合性
阅读原文
相关文章:
为什么工作流中围绕XML做EDI报文数据解析/生成?
经常有客户问起,为什么在处理EDI文件时不一次到位,而需要使用多个端口来分次进行处理呢,是不是想要多占用几个端口好多卖钱呀? 实际上,在一开始的知行EDI产品中,功能还没有这么完善,当时只支持…...
C++的运算符重载介绍
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对…...
C++vector的使用
vector的使用 1.vector的介绍2.vector的使用3.Member functions3.1构造函数3.2拷贝构造3.3赋值运算符重载 4.iterator5.capacity6.Element access7.增删查改7.1增7.2删7.3查7.4改 1.vector的介绍 1.vector是表示可变大小数组的序列容器. 2.vector也采用连续空间存储元素&#x…...
angular测试API
1.resetTestEnvironment 是 Angular 测试中的一个函数,用于重置测试环境。它通常与 initTestEnvironment 和 platformBrowserDynamicTesting 一起使用,以确保在多个测试套件之间正确清理和重置 Angular 测试环境。 这是 resetTestEnvironment 函数的形式…...
mfc 浮动窗口
参考 MFC模拟360悬浮窗加速球窗口...
【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载
函数的高级应用,侧重介绍函数的默认参数、函数的占位参数、函数重载定义解释及使用。 文章目录 一、函数的默认参数二、函数的占位参数三、函数重载函数重载的注意事项 一、函数的默认参数 函数默认参数是指在函数声明时为参数提供一个默认值,这样在调…...
Java——》synchronized的原理
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...
CPU主频
CPU主频,也称为时钟频率,是指中央处理单元(CPU)的工作时钟的速度,通常以赫兹(Hz)为单位表示。它表示CPU每秒钟执行的时钟周期数。CPU主频是CPU性能的一个重要指标之一,但不是唯一的性…...
PHP8中查询数组中指定元素-PHP8知识详解
php是使用最广泛的web编程语言,数组是一个数据集合,数组是一种非常常用的数据类型。在操作数组时,有时我们需要查询数组中是否有某个指定元素。在实际的程序开发中,我们用到了下列方法来查询数组中指定的元素:使用arra…...
在Git中将本地分支推送到远程仓库
这里很明显 我git云端只有一个master分支 然后 我在本地创建了一个develop分支 然后 现在我想将他放在云端 首先 我们要执行 git checkout -b develop将本地切换到 develop 分支上 因为我这里已经选择的就是了 就不需要了 然后我们执行 git push origin develop这样 刷新云…...
【数据仓库基础(四)】数据仓库需求:基本需求和数据需求
文章目录 一. 基本需求1. 安全性2. 可访问性3. 自动化 三. 数据需求1. 准确性2.时效性3.历史可追溯性 从基本需求和数据需求两方面介绍对数据仓库系统的整体要求。 一. 基本需求 1. 安全性 数据仓库中含有机密和敏感的数据。为了能够使用这些数据&…...
C++类模板是一种通用的编程工具,可以创建可以适用于多种数据类型的类
C类模板是一种通用的编程工具,可以创建可以适用于多种数据类型的类。它们允许在类定义中使用参数,以便根据需要实例化具体的类。使用C类模板时,首先需要定义模板。模板定义的语法如下:cpp template <typename T> class MyCl…...
Vite和Webpack如何使用CDN包
为了精简打包输出的dist目录大小,我们可以引入CDN外部包的方式,来缩小打包的体积,加快打包速度。这里介绍Vite和Webpack中如何引入React CDN外部包。 一、Vite引入CDN包 1、安装插件 npm i vitejs/plugin-react-refresh vite-plugin-cdn-i…...
TOWE雷达光敏感应开关,让生活更智能、更安全
现代生活中,智能家居成为人们追求品质生活的必备之选。其中,照明控制的智能化已然成为一种趋势,传统的灯光开关需要人们手动操作,既不方便,有时候也会造成资源的过度浪费,而雷达光敏感应开关的出现…...
git:亲测体验rebase与merge
rebase与merge异同与最佳使用场景[1] 这个dev-cui分支从devlop分支切出后,一直都只有我一个人在开发&维护. 假如还有一位同事张三, 在devlop分支切出的分支dev-zhangsan上进行开发,他添加了一个glossary.md,而后进行了add & commit 此时项目开发完成,需要将两个分支合并…...
深度神经网络之BiseNet
标题:深度神经网络之BiseNet 1.模型介绍 BiseNet是一种用于实时语义分割的神经网络模型,由华为公司提出。它结合了全卷积网络和空间金字塔池化模块的优点,可以同时实现高效率和高精度的语义分割。 BiseNet的核心思想是将图像分为两个部分&…...
Ubantu终端常用命令、快捷键和基本操作
目录 前言 一、常用命令 二、常用快捷键 三、快捷键自定义设置 总结 前言 Ubantu终端常用命令和快捷键用于进行系统管理、文件操作、软件安装等常见使用场景。使用它们可以提高工作效率,简化操作流程,并进行更多的自定义配置和控制。同时,…...
9.5 校招 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | 航天五院2024届校园招聘启动 校招 | 航天五院2024届校园招聘启动 2、校招 | 中国电科五十五所2024届校园招聘正式启动 校招 | 中国电科五十五所2024届校园招聘正式启动 3、校招 | …...
计算机网络中的应用层和传输层(http/tcp)
目录 1、协议的通俗理解 1.1 理解协议 2.应用层 2.1 http协议 2.2 HTTP的方法 2.3 HTTP的状态码 2.4 HTTP常见Header 3、传输层 3.1 端口号 3.1.1 端口号范围划分 3.1.2 netstat 3.1.3 认识知名端口号(Well-Know Port Number) 3.2 UDP协议 3.2.1 UDP协议端格式 3…...
基于antd+vue2来实现一个简单的绘画流程图功能
简单流程图的实现(基于antdvue2的)代码很多哦~ 实现页面如下 1.简单操作如下 2.弹框中使用组件: <vfdref"vfd"style"background-color: white;":needShow"true":fieldNames"fieldNames"openUse…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
