知行之桥EDI系统从2020版本开始引入了Validate端口,用来实现对XML数据文件进行一些规则的验证,保证XML数据文件的有效性。本文将介绍如何使用Validate端口。
端口创建
同其他功能性端口一样,只需要将Validata端口从左侧的端口清单拖拽到右侧的工作空间就可以创建一个Validate端口进行使用,如下图创建一个端口名称为Validate_Test的Validate端口:
端口功能
Validate端口通过设置一些校验规则,对输入的XML数据文件进行有效性校验,比如数据转换过程中常见的数据库XML、EDI标准XML、自定义XML,所以使用该端口需要保证数据源文件为XML文件。
Validate端口支持对输入的XML文件进行xpath验证和Header验证:
xpath验证:对输入的XML文件结构,比如节点路径、节点值进行校验。
Header验证:对输入文件消息头部信息进行校验,比如文件名称(filename)
本文将用以下示例XML进行演示:
<Items>
<Header>
<po_number>POTEST001</po_number>
<po_date>20221221</po_date>
<BY_name>TESTC</BY_name>
<BY_code>A123</BY_code>
<SU_name>TESTB</SU_name>
<SU_code>B456</SU_code>
<PO_QTY>100</PO_QTY>
<PO_unit>EA</PO_unit>
<PO_price>10.12</PO_price>
<Detail>
<line_no>01</line_no>
<line_QTY>60</line_QTY>
<ship_date>20230103</ship_date>
</Detail>
<Detail>
<line_no>02</line_no>
<line_QTY>40</line_QTY>
<ship_date>20230120</ship_date>
</Detail>
</Header>
</Items>
校验规则
Validate端口主要支持以下规则的设置:
1.等于与不等于规则
等于:指定条件等于一个固定值
不等于:指定条件不等于一个固定值
示例:Items/Header/BY_name 等于TESTA
当输入的BY_name字段值为TESTA时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不为TESTA时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: == TESTA Actual: TESTC,并停止处理该XML文件。
2.包含规则
包含规则:指定条件包含指定的字符串
示例1:Items/Header/BY_name 包含TEST
当输入的BY_name字段值 包含TEST字符串时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不包含TEST字符串时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: =~ TEST Actual: C,并停止处理该XML文件。
示例2:判断文件名是否包含test
当输入的文件名 包含test字符串时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的文件名不包含test字符串时,抛出异常:The value at header “filename” does not satisfy a validation rule. Expected: =~ test Actual: TEST-20221220-2.txt,并停止处理该XML文件。
3.前缀和后缀规则:
前缀为:指定条件是否以指定字符串开头
后缀为:指定条件是否以指定字符串结尾
示例:Items/Header/BY_name 前缀为TEST
当输入的BY_name字段值以TEST开头时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不是以TEST开头时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: =~ TEST* Actual: C,并停止处理该XML文件。
4.小于大于等于规则:
小于:指定条件小于固定值
小于或等于:指定条件小于或等于固定值
大于:指定条件大于固定值
大于或等于:指定条件大于或等于固定值
示例:Items/Header/PO_QTY 与100进行比较
当输入的PO_QTY字段值小于100时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的PO_QTY字段值不小于100时,抛出异常:The value at xpath “/Items/Header/PO_QTY/” does not satisfy a validation rule. Expected: < 100 Actual: 100,并停止处理该XML文件。
5.指定条件是否为空规则(该指定条件存在,对指定条件的值进行校验):
为空:指定条件存在,并且指定条件的值为空
不为空:指定条件存在,并指定条件的值不为空
示例:/Items/Header/PO_unit 为空
当输入的PO_unit字段存在,但是值为空时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的PO_unit字段存在,但是值不为空时,抛出异常:The value at xpath “/Items/Header/PO_unit/” does not satisfy a validation rule. Expected: == Actual: EA,并停止处理该XML文件。
6.指定条件是否存在规则:
为Null:指定条件存在,对指定条件的值是否存在没有限制
不为Null:指定条件不存在
示例:/Items/Header/PO_unit 为Null
当输入的PO_unit字段不存在时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的PO_unit字段存在时,抛出异常:The value at xpath “/Items/Header/PO_unit/” does not satisfy a validation rule. Expected: IS NULL Actual:,并停止处理该XML文件。
需要注意与上一个规则组“指定条件是否为空”的区别。
7.属于:指定条件是否属于指定数组中的值(区分大小写)
属于:指定条件属于指定数组中的值
不属于:指定条件不属于指定数组中的值
示例:/Items/Header/BY_name 属于 (TESTA,TESTB,TESTC)中的一个
当输入的BY_name字段值属于数组(TESTA,TESTB,TESTC)中的一个值时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不属于数组(TESTA,TESTB,TESTC)中的一个值时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: IS IN [TESTA,TESTB,TESTC] Actual: TESTD,并停止处理该XML文件。
8.正则匹配:设置一些正则匹配规则
示例:/Items/Header/BY_name 节点值为TESTA,忽略大小写,可以设置(?i)TESTA来实现
当输入的BY_name字段值为TESTA,不对大小写进行校验,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不为TESTA(大小写都支持)时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: =# (?i)TESTA Actual: testB,并停止处理该XML文件。
9.Glob匹配:设置一些简单的正则规则
示例:/Items/Header/BY_name 为A开头的字符串,可以设置A来实现
当输入的BY_name字段值为A开头的字符串时,输入的XML文件成功处理,并进行后续端口的处理。
当输入的BY_name字段值不为A开头的字符串时,抛出异常:The value at xpath “/Items/Header/BY_name/” does not satisfy a validation rule. Expected: < A Actual: BA123,并停止处理该XML文件。
配置多条规则
以上示例都是设置的一条校验规则,针对同一个XML文件可以同时设置多个规则,通过and或者or进行组合来实现,所以对于同一种格式的XML文件的校验,可以使用一个Validate端口实现需要设置的所有校验规则,如下图:
以上便是本次项目案例的全部内容了,了解更多 EDI 信息,请参阅: EDI 是什么?
阅读原文