什么是 EDI 分隔符?
在阅读 EDI 报文的时候,会看到除了各种各样的 EDI 数据段之外,还有许多特殊字符(如X12报文中的*分隔符)穿插其中,这些特殊字符在 EDI 报文中承担着分隔不同业务数据的作用,被称为EDI分隔符。
都有哪些常见的 EDI 分隔符?
我们以常见的 X12 和 EDIFACT 报文为例:
1.X12
以上是 X12 示例报文,可以看到除了英文和数字之外,还有字符 *,这里的 * 即是 EDI 报文中的数据元素分隔符。
2.EDIFACT
以上是 EDIFACT 示例报文,其中 + 为 EDI 报文中的数据元素分隔符, : 是组件元素分隔符,而 ‘ 则是段终止符。
除了以上提到的两种常见的分隔符以外,还可以自定义分隔符。
以知行之桥 EDI 系统中的 EDIFACT 端口为例,在 高级设置 > EDI 分隔符 中即可进行设置。
这些 EDI 分隔符分别表示哪些含义呢?
数据元素分隔符:分隔文档中各个数据元素的字符。 组件元素分隔符:在文档的复合数据结构中分隔元素的字符。 段终止符:指示文档中某一段结束的字符。 转义字符:“释放”下一个字符的字符,覆盖其通常的含义。这允许保留字符在文档中显示为数据,只要它们前面有转义字符。 重复元素字符:表示元素值重复的字符。 后缀:附加到段终止符以区分不同数据段。
X12 端口如下所示:
EDI 分隔符在业务场景下的应用
场景一:业务数据中的符号与分隔符冲突导致转换 X12/EDIFACT 报文有误
X12报文转换
A 公司的业务系统上传业务数据至知行之桥 EDI 系统,通过 X12 端口转换为 X12 报文时,输出结果有误。
造成报错的原因是 A 公司推来的业务数据中有特殊符号,恰巧与已有的 EDI 分隔符冲突了。
解决办法1:
在知行之桥EDI系统的X12端口中,修改与业务数据冲突的EDI分隔符。如下图所示:
修改EDI分隔符需要和A公司的交易伙伴进行沟通,询问对方是否能够处理修改后的分隔符。
解决办法2:
如果交易伙伴告诉我们不可以修改EDI分隔符,应该如何处理?
因为X12标准没有转义字符,和A公司沟通之后,我们将特殊字符统一转成了空格或者留空,这样就避免了在转换 X12 报文时,因为分隔符冲突产生的报错。
通过 replace 格式化器解决:
replace(oldvalue, newvalue[, ishex])
用第二个参数的值替换属性值所代表的字符串中出现的所有第一个参数。
- oldvalue:要替换的字符串。
- newvalue:要替换第一个参数的所有出现的字符串。
- ishex:可选的布尔值,用于指定第一个参数是否是要替换的字符的十六进制表示。默认值为 false 。
示例:
1 2 |
<arc:set attr="myString" value="I hope you have a wonderful day." /><arc:set attr="honestString" value="[myString | replace('you', 'I')]" /> <!-- honestString holds the value: I hope I have a wonderful day. --> |
我们在 XMLMap 端口中使用如上格式化器,对业务数据中的特殊符号进行替换,示例如下:
EDIFACT 报文转换
以上问题如果在EDIFACT中应该如何处理呢?
EDIFACT国际标准中,支持转义字符。因此针对上述问题我们可以在业务数据与分隔符冲突的符号前加上转义字符即可解决。知行之桥EDI系统中,默认的转义字符为: ? 如下图所示:
企业也可以根据实际需求对转义字符进行自定义设置,需要和交易伙伴提前进行沟通,确保交易伙伴支持您自定义的转义字符。
场景二:保留节点
在 Y 公司对接 NIKE 的 EDI 项目中,通过知行之桥 EDI系统的 X12 端口将目标XML 文件转换为 X12 报文,设置的 EDI 分隔符如下:
将冒号设置为组件元素标识符,Y 公司希望即使RFF段结尾没有业务数据也要保留当前RFF段,输出为 RFF+AHJ:’
需要在X12端口的高级设置选项卡下的特殊设置中添加:
includeemptyelements = true
如图所示:
场景三:EDI 分隔符支持设置以0x开头的16进制值
除了常见的以单个字符作为 EDI 分隔符以外,还可以设置以 0x 开头的16进制值。例如:在 X12 端口的高级设置下,将数据元素分隔符设置为 0xa0。
结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ISA 00 00 ZZ ZZ 220906 1533 U 00401 000000001 0 T :~ GS IN 20220906 1533 1 T 004010~ ST 810 0001~ BIG 20150708 3003014445 0476553272 DR~ CUR SE USD~ REF 8M 0056~ N1 BY Company 92 544380~ N3 Address~ N4 City CA Postal Code~ N1 ST Name 92 0607047800010~ N3 Address~ N4 City 200131 US~ N1 RE Name 92 5095956~ N3 Address~ N4 City IL Postal Code~ IT1 20 2500 EA 36.96 BP 335S0594~ REF KK 0099778154~ REF PO 0476553272 20~ TDS 9240000~ CTT 1~ SE 19 0001~ GE 1 1~ IEA 1 000000001~ |
注意:不同的交易伙伴可能会对元素分隔符有特殊的要求,具体使用哪些元素分隔符需要以交易伙伴提供的示例文件为准。
场景四:段终止符为空且支持换行
H 公司的交易伙伴提出,他们需要接收的 X12 文件格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
ISA*00* *00* *ZZ* *ZZ* *220906*1549*U*00401*000000013*0*T*: GS*IN* * *20220906*1549*13*T*004010 ST*810*0001 BIG*20150708*3003014445**0476553272***DR CUR*SE*USD REF*8M*0056 N1*BY*Company*92*544380 N3*Address N4*City*CA*Postal Code N1*ST*Name*92*0607047800010 N3*Address N4*City**200131*US N1*RE*Name*92*5095956 N3*Address N4*City*IL*Postal Code IT1*20*2500*EA*36.96**BP*335S0594 REF*KK*0099778154 REF*PO*0476553272*20 TDS*9240000 CTT*1 SE*19*0001 GE*1*13 IEA*1*000000013 |
在 EDI 系统中,设置 EDI 分隔符中的段终止符为空格是否可以实现上述效果呢?
方法一:
如下图所示:
仅简单的设置段终止符为空格,EDI 系统将会提示报错。我们还需要在EDI系统的安装目录下,找到 X12 端口下的 port.cfg 中加上:
1 |
SegmentTerminator = "\n" |
保存修改后,再次发送文件,即可成功转换为上述交易伙伴要求的格式啦!
注: port.cfg路径示例:
C盘>ProgramData>ArcESB>workspaces>CompanyA>CompanyA_XMLToX12_P
其中ProgramData是隐藏文件夹,CompanyA_XMLToX12_P是CompanyA工作区中被命名为CompanyA_XMLToX12_P的X12端口。
方法二:
配置 EDI 分隔符中的段终止符为 0x0A 如下所示:
更多EDI信息,请参阅: EDI 是什么?
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。