当前位置: 首页 > 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等

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

阅读原文

相关文章:

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

经常有客户问起&#xff0c;为什么在处理EDI文件时不一次到位&#xff0c;而需要使用多个端口来分次进行处理呢&#xff0c;是不是想要多占用几个端口好多卖钱呀&#xff1f; 实际上&#xff0c;在一开始的知行EDI产品中&#xff0c;功能还没有这么完善&#xff0c;当时只支持…...

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 测试中的一个函数&#xff0c;用于重置测试环境。它通常与 initTestEnvironment 和 platformBrowserDynamicTesting 一起使用&#xff0c;以确保在多个测试套件之间正确清理和重置 Angular 测试环境。 这是 resetTestEnvironment 函数的形式…...

mfc 浮动窗口

参考 MFC模拟360悬浮窗加速球窗口...

【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载

函数的高级应用&#xff0c;侧重介绍函数的默认参数、函数的占位参数、函数重载定义解释及使用。 文章目录 一、函数的默认参数二、函数的占位参数三、函数重载函数重载的注意事项 一、函数的默认参数 函数默认参数是指在函数声明时为参数提供一个默认值&#xff0c;这样在调…...

Java——》synchronized的原理

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

CPU主频

CPU主频&#xff0c;也称为时钟频率&#xff0c;是指中央处理单元&#xff08;CPU&#xff09;的工作时钟的速度&#xff0c;通常以赫兹&#xff08;Hz&#xff09;为单位表示。它表示CPU每秒钟执行的时钟周期数。CPU主频是CPU性能的一个重要指标之一&#xff0c;但不是唯一的性…...

PHP8中查询数组中指定元素-PHP8知识详解

php是使用最广泛的web编程语言&#xff0c;数组是一个数据集合&#xff0c;数组是一种非常常用的数据类型。在操作数组时&#xff0c;有时我们需要查询数组中是否有某个指定元素。在实际的程序开发中&#xff0c;我们用到了下列方法来查询数组中指定的元素&#xff1a;使用arra…...

在Git中将本地分支推送到远程仓库

这里很明显 我git云端只有一个master分支 然后 我在本地创建了一个develop分支 然后 现在我想将他放在云端 首先 我们要执行 git checkout -b develop将本地切换到 develop 分支上 因为我这里已经选择的就是了 就不需要了 然后我们执行 git push origin develop这样 刷新云…...

【数据仓库基础(四)】数据仓库需求:基本需求和数据需求

文章目录 一. 基本需求1. 安全性2. 可访问性3. 自动化 三. 数据需求1. 准确性2&#xff0e;时效性3&#xff0e;历史可追溯性 从基本需求和数据需求两方面介绍对数据仓库系统的整体要求。 一. 基本需求 1. 安全性 数据仓库中含有机密和敏感的数据。为了能够使用这些数据&…...

C++类模板是一种通用的编程工具,可以创建可以适用于多种数据类型的类

C类模板是一种通用的编程工具&#xff0c;可以创建可以适用于多种数据类型的类。它们允许在类定义中使用参数&#xff0c;以便根据需要实例化具体的类。使用C类模板时&#xff0c;首先需要定义模板。模板定义的语法如下&#xff1a;cpp template <typename T> class MyCl…...

Vite和Webpack如何使用CDN包

为了精简打包输出的dist目录大小&#xff0c;我们可以引入CDN外部包的方式&#xff0c;来缩小打包的体积&#xff0c;加快打包速度。这里介绍Vite和Webpack中如何引入React CDN外部包。 一、Vite引入CDN包 1、安装插件 npm i vitejs/plugin-react-refresh vite-plugin-cdn-i…...

TOWE雷达光敏感应开关,让生活更智能、更安全

现代生活中&#xff0c;智能家居成为人们追求品质生活的必备之选。其中&#xff0c;照明控制的智能化已然成为一种趋势&#xff0c;传统的灯光开关需要人们手动操作&#xff0c;既不方便&#xff0c;有时候也会造成资源的过度浪费&#xff0c;而雷达光敏感应开关的出现&#xf…...

git:亲测体验rebase与merge

rebase与merge异同与最佳使用场景[1] 这个dev-cui分支从devlop分支切出后,一直都只有我一个人在开发&维护. 假如还有一位同事张三, 在devlop分支切出的分支dev-zhangsan上进行开发,他添加了一个glossary.md,而后进行了add & commit 此时项目开发完成,需要将两个分支合并…...

深度神经网络之BiseNet

标题&#xff1a;深度神经网络之BiseNet 1.模型介绍 BiseNet是一种用于实时语义分割的神经网络模型&#xff0c;由华为公司提出。它结合了全卷积网络和空间金字塔池化模块的优点&#xff0c;可以同时实现高效率和高精度的语义分割。 BiseNet的核心思想是将图像分为两个部分&…...

Ubantu终端常用命令、快捷键和基本操作

目录 前言 一、常用命令 二、常用快捷键 三、快捷键自定义设置 总结 前言 Ubantu终端常用命令和快捷键用于进行系统管理、文件操作、软件安装等常见使用场景。使用它们可以提高工作效率&#xff0c;简化操作流程&#xff0c;并进行更多的自定义配置和控制。同时&#xff0c…...

9.5 校招 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 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来实现一个简单的绘画流程图功能

简单流程图的实现&#xff08;基于antdvue2的&#xff09;代码很多哦~ 实现页面如下 1.简单操作如下 2.弹框中使用组件&#xff1a; <vfdref"vfd"style"background-color: white;":needShow"true":fieldNames"fieldNames"openUse…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...