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

为什么工作流中围绕XML做EDI报文数据解析/生成?

经常有客户问起,为什么在处理EDI文件时不一次到位,而需要使用多个端口来分次进行处理呢,是不是想要多占用几个端口好多卖钱呀?

实际上,在一开始的知行EDI产品中,功能还没有这么完善,当时只支持EDI常见的传输协议,那个时候我们在做报文翻译时,还不能仅通过简单的配置来实现,需要手写代码,去读取报文,然后获取每一行的数据,再逐一去读对应的业务值。参考之前的实施经验,觉得实施过程漫长、前期开发代码量大、后期维护成本也高,经过产品部门多次考量,在一次次的产品升级过程中,不停的进行功能新增、完善,才形成了现在这样的一套报文处理模式。

那么,到底是不是直接对报文进行处理更简单呢?

假设我们现在通过AS2传输,接收850采购订单EDI报文,采用自定义XML方案。

直接处理EDI报文

我们来回顾一下直接处理业务报文的步骤:

首先,通过AS2收到850采购订单后,要直接进行处理,完成报文翻译,我们的代码逻辑大约如下:

  1. 先读取当前850采购订单报文的内容
  2. 对内容进行分割,将850采购订单的内容按照节点分割,例如:ST节点,BEG节点等等,每个节点代表不同的信息
  3. 开始逐一读取节点,匹配节点所属的业务含义,并将每个节点中的详细业务数据读取出来
  4. 一边读取数据,一边输出自定义XML
  5. 调试程序,确认业务逻辑和取值正确

以上步骤中我们可以看出,所有的处理都要使用代码来实现,那么代码量一定是非常大的。同时,因为EDI报文中数据比较多,而且结构复杂,所以代码逻辑也会非常复杂。在初步完成代码之后,后续的业务测试过程中,若是因为对EDI报文理解不到位,想要修改某一部分的处理逻辑或是取值方式,将会造成很大的工作量,而且往往都是牵一发而动全身,修改可能会造成其他本来正确的数据出错。同时,在切换生产环境之后,如果贸易合作伙伴对EDI规范做了某些升级或者调整,后来的维护人员需要将整个的代码整体通读一遍,完全理解之后,才能进行修改。

分步处理EDI报文

如果在目前的知行EDI产品中,我们分多个端口去完成报文翻译,每个端口都只负责各自的功能部分,那么整体步骤如下:

  1. AS2端口收到850采购订单后,直接转发到X12端口(直接配置实现)
  2. X12端口将EDI报文转换为标准XML,并转发到XMLMap端口(直接配置实现)
  3. 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等

  • 增加功能模块的独立性,降低耦合性

阅读原文

http://www.lryc.cn/news/163025.html

相关文章:

  • C++的运算符重载介绍
  • C++vector的使用
  • angular测试API
  • mfc 浮动窗口
  • 【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载
  • Java——》synchronized的原理
  • CPU主频
  • PHP8中查询数组中指定元素-PHP8知识详解
  • 在Git中将本地分支推送到远程仓库
  • 【数据仓库基础(四)】数据仓库需求:基本需求和数据需求
  • C++类模板是一种通用的编程工具,可以创建可以适用于多种数据类型的类
  • Vite和Webpack如何使用CDN包
  • TOWE雷达光敏感应开关,让生活更智能、更安全
  • git:亲测体验rebase与merge
  • 深度神经网络之BiseNet
  • Ubantu终端常用命令、快捷键和基本操作
  • 9.5 校招 内推 面经
  • 计算机网络中的应用层和传输层(http/tcp)
  • 基于antd+vue2来实现一个简单的绘画流程图功能
  • 【小吉送书—第二期】阿里后端开发:抽象建模经典案例
  • 深度学习常用的Python库(核心库、可视化、NLP、计算机视觉、深度学习等)
  • Android菜单(上下文菜单)(选项菜单)
  • l8-d11 TCP连接管理与UDP协议
  • Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】
  • 商业航天进展迅速:中国航天科工三院成功完成电磁发射试验
  • MySQL和Oracle数据库引擎
  • CloudQuery X PolarDB:让数据库管理更简单
  • 机器学习开源工具BatteryML,一站式分析与预测电池性能
  • TypeScript:赋予JavaScript数据类型新的力量,提升编程效率!
  • LLMs之Baichuan 2:《Baichuan 2: Open Large-scale Language Models》翻译与解读